Оба ваших запроса подходят для этой задачи. Ни один действительно лучше, чем другой. Но один может быть быстрее другого, что вы можете узнать с помощью EXPLAIN PLAN
. В идеале Oracle должен был бы предложить один и тот же план выполнения для обоих, но оптимизатору сложно определить, что оба запроса выполняют одно и то же.
Начиная с Oracle 12c, я бы использовал CROSS APPLY
:
select u.*, a.id, a.address
from my_user u
cross apply
(
select *
from my_address ma
where ma.username = u.username
order by ma.id desc
fetch first row only
) a;
В более ранних версиях (начиная с Oracle 9i):
select u.*, a.id, a.address
from my_user u
join
(
select ma.*, row_number() over (partition by username order by id desc) as rn
from my_address ma
) a on a.username = u.username and a.rn = 1;
В более ранних версиях:
select u.*, a.id, a.address
from my_user u
join
(
select *
from my_address ma
where id in (select max(id) from my_address group by username)
) a on a.username = u.username;
Демо: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=c0d3ab6617956cb69f979a413026f6db