Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

SQL:como limitar uma junção na primeira linha encontrada?


A palavra-chave aqui é PRIMEIRO . Você pode usar a função analítica FIRST_VALUE ou construção agregada FIRST .
Para FIRST ou LAST o desempenho nunca é pior e frequentemente melhor que o equivalente FIRST_VALUE ou LAST_VALUE construir porque não temos uma ordenação de janela supérflua e, consequentemente, um custo de execução menor:
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 */
;

Desde que 12c introduziu o operador LATERAL , bem como CROSS/OUTER APPLY joins, possibilita o uso de uma subconsulta correlacionada no lado direito de JOIN cláusula:
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 */
;