Oracle
 sql >> Base de données >  >> RDS >> Oracle

SQL :comment limiter une jointure sur la première ligne trouvée ?

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 */
;