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