2009-02-12 3 views
0

У меня есть следующий пример запроса,Для Oracle SQL, получить определенное значение по нескольким таблицам и столбцам

select o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE, l.COMPANY_ID 
from TABLE1 o, TABLE2 l 
where o.ENTRY_ID = l.ENTRY_ID 
and COMPANY_ID in (10, 11, 12, 13) 

, который возвращает набор данных, подобное следующему:

ENTRY_ID, DESCRIPTION, ENTRY_DATE, COMPANY_ID 
1, Description 1, 2/12/2008, 10 
2, Description 2, 2/12/2008, 10 
3, Description 3, 2/10/2008, 10 
4, Description 4, 2/11/2008, 10 
4, Description 4, 2/11/2008, 11 
4, Description 4, 2/11/2008, 12 
4, Description 4, 2/11/2008, 13 

If запись связана с несколькими компаниями, этот запрос возвращает одну и ту же запись 1 раз для каждой компании, с которой она связана.

Я хотел бы, чтобы запрос отличался от COMPANY_ID, так что если запись связана с несколькими компаниями, она возвращается только один раз.

Вот результирующий набор я хочу вернулся:

ENTRY_ID, DESCRIPTION, ENTRY_DATE, COMPANY_ID 
    1, Description 1, 2/12/2008, 10 
    2, Description 2, 2/12/2008, 10 
    3, Description 3, 2/10/2008, 10 
    4, Description 4, 2/11/2008, 10 

но, следующий будет приемлемым, а также,

ENTRY_ID, DESCRIPTION, ENTRY_DATE, COMPANY_ID 
    1, Description 1, 2/12/2008, 10 
    2, Description 2, 2/12/2008, 10 
    3, Description 3, 2/10/2008, 10 
    4, Description 4, 2/11/2008, 11 

Я хочу отчетливое entry_id. В результирующем наборе, который я получаю сейчас, я получаю четыре записи с ENTRY_ID, потому что четыре разные компании делят эту запись. Я хочу, чтобы только одна запись возвращалась, когда запись делится между несколькими компаниями.

+0

Когда это происходит, какое значение вы хотите увидеть от company_id? Это может изменить ответы людей. –

ответ

1
SELECT ENTRY_ID, DESCRIPTION, ENTRY_DATE, COMPANY_ID 
FROM (
    SELECT o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE, l.COMPANY_ID, 
     ROW_NUMBER() OVER (PARTITION BY company_id ORDER BY entry_date DESC, entry_id DESC) AS rn 
    FROM TABLE1 o, TABLE2 l 
    WHERE o.ENTRY_ID = l.ENTRY_ID 
    AND COMPANY_ID in (10, 11, 12, 13) 
) 
WHERE rn = 1 

Это вернет запись с последней ENTRY_DATE или большее ENTRY_ID быть там больше, чем один вход равен последнему ENTRY_DATE

0

Если вы счастливы иметь самый большой COMPANY_ID вернулся:

select o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE, MAX(l.COMPANY_ID) AS COMPANY_ID 
from TABLE1 o, TABLE2 l 
where o.ENTRY_ID = l.ENTRY_ID 
and COMPANY_ID in (10, 11, 12, 13) 
group by o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE; 
0

Я хотел бы, чтобы запрос отличался от COMPANY_ID, так что если запись связана с несколькими компаниями, она возвращается только один раз.

Вопрос не ясен, вам нужны отдельные записи или отдельные компании. Возможно, вы также можете показать результат, который хотите, чтобы мы могли лучше понять.

Если вы хотите различные записи и company_id перечислять с ним не имеет значения здесь запрос:

select * from (
select o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE, l.COMPANY_ID, row_number() over (partition by o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE order by l.COMPANY_ID) rn 
from TABLE1 o, TABLE2 l 
where o.ENTRY_ID = l.ENTRY_ID 
and COMPANY_ID in (10, 11, 12, 13) 
) 
where rn=1;