2010-10-04 1 views
1

Опытные гуру SQL и Oracle У меня есть несколько сложный запрос, который я пытаюсь построить.Оставшееся соединение на нескольких таблицах с отметками времени

Вот мой текущий запрос:

select distinct person_info.person_name 
    table2.value, 
    table3.value, 
    table4.value, 
    table5.value 
from person_info 
    left join table2 on table2.person_name=person_info.person_name 
    left join table3 on table3.person_name=person_info.person_name 
    left join table4 on table4.person_name=person_info.person_name 
    left join table5 on table5.person_name=person_info.person_name; 

Первичный ключ для каждой таблицы является как person_name и timestamp. Теперь моя проблема в том, что если в таблице существует несколько экземпляров одного и того же person_name, тогда я хочу только left join на самом последнем. Кто-нибудь знает, как добавить это поведение в этот запрос? Я использую Oracle.

Спасибо!

+0

Есть даты начала и окончания каждой таблицы, или только один столбец временной метки? Обычно, когда запись применима только для определенного диапазона дат, записываются как начальная, так и конечная даты. –

+0

Только столбец временной метки, указывающий, когда запись была вставлена ​​ –

+0

@ Марк Баннистер - я не согласен. Если вы сохраняете как временные метки начала, так и конца, вы рискуете как перекрывающимися диапазонами, так и диапазонами без значений. Тем не менее, если вы храните, например, EFFECTIVE_DATE в качестве единственного fencepost, вы затем выполняете поиск наибольшего EFFECTIVE_DATE меньше, чем какая-либо дата интереса. –

ответ

4

Try:

select distinct person_info.person_name 
    t2.value, 
    t3.value, 
    t4.value, 
    t5.value 
from person_info 
    left join (select t.*, row_number() over (partition by person_name order by timestamp_column desc) rowno from table2 t) t2 
     on t2.person_name=person_info.person_name and t2.rowno=1 
    left join (select t.*, row_number() over (partition by person_name order by timestamp_column desc) rowno from table3 t) t3 
     on t3.person_name=person_info.person_name and t3.rowno=1 
    left join (select t.*, row_number() over (partition by person_name order by timestamp_column desc) rowno from table4 t) t4 
     on t4.person_name=person_info.person_name and t4.rowno=1 
    left join (select t.*, row_number() over (partition by person_name order by timestamp_column desc) rowno from table5 t) t5 
     on t5.person_name=person_info.person_name and t5.rowno=1; 
+0

Что такое 'product_id'? После раздела 'partition by'? –

+1

Nevermind, я предполагаю, что он должен быть 'person_name'. Возможно, вы захотите обновить свое решение :) Спасибо! –

+0

Упс! Хорошо заметили - ответьте соответствующим образом. –

 Смежные вопросы

  • Нет связанных вопросов^_^