2010-10-04 5 views
1

Ok Les gourous SQL et Oracle J'ai une requête un peu compliquée que j'essaie de construire.Quitter plusieurs tables avec des horodateurs

Voici ma requête en cours:

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; 

La clé primaire pour chaque table est à la fois person_name et un timestamp. Maintenant, mon problème est que si plusieurs instances de la même person_name existent dans une table, je veux seulement left join sur le plus récent. Est-ce que quelqu'un sait comment ajouter ce comportement à cette requête? J'utilise Oracle.

Merci!

+0

Y at-il dates de début et de fin sur chaque table, ou tout simplement une colonne d'horodatage? Normalement, lorsqu'un enregistrement n'est applicable que pour une plage de dates spécifique, les dates de début et de fin sont enregistrées. –

+0

Juste une colonne d'horodatage indiquant quand l'enregistrement a été inséré –

+0

@ Mark Bannister - Je ne suis pas d'accord. Si vous stockez les horodatages de début et de fin, vous risquez d'avoir à la fois des plages de chevauchement et des plages sans valeurs. Toutefois, si vous stockez, par exemple, EFFECTIVE_DATE en tant que fencepost unique, vous recherchez alors le EFFECTIVE_DATE le plus grand moins qu'une date d'intérêt. –

Répondre

4

Essayez:

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

À quoi sert le 'product_id'? Après la clause 'partition by'? –

+1

Peu importe, je suppose que c'est supposé être 'person_name'. Vous voudrez peut-être mettre à jour votre solution :) Merci! –

+0

Oups! Bien repéré - réponse mise à jour en conséquence. –

Questions connexes