Le mot clé ici est PREMIER . Vous pouvez utiliser la fonction analytique FIRST_VALUE
ou construction agrégée FIRST
.
Pour FIRST
ou LAST
les performances ne sont jamais pires et souvent meilleures que l'équivalent FIRST_VALUE
ou LAST_VALUE
car nous n'avons pas de tri de fenêtre superflu et par conséquent un coût d'exécution moindre :
select table_A.id, table_A.name, firstFromB.city
from table_A
join (
select table_B.id2, max(table_B.city) keep (dense_rank first order by table_B.city) city
from table_b
group by table_B.id2
) firstFromB on firstFromB.id2 = table_A.id
where 1=1 /* some conditions here */
;
Depuis 12c introduit l'opérateur LATERAL
, ainsi que CROSS/OUTER APPLY
joins, permettent d'utiliser une sous-requête corrélée sur le côté droit de JOIN
clause :
select table_A.id, table_A.name, firstFromB.city
from table_A
cross apply (
select max(table_B.city) keep (dense_rank first order by table_B.city) city
from table_b
where table_B.id2 = table_A.id
) firstFromB
where 1=1 /* some conditions here */
;