Sql 连接两个表,取最大值的表
我想以一对多的关系连接两个表,但在第二个表中只选择一行,即在第二个表的第X列处具有最大值的行 这是你的电话号码 以下是我的第一个解决方案:Sql 连接两个表,取最大值的表,sql,oracle,join,Sql,Oracle,Join,我想以一对多的关系连接两个表,但在第二个表中只选择一行,即在第二个表的第X列处具有最大值的行 这是你的电话号码 以下是我的第一个解决方案: select u.*, a.id, a.address from my_user u inner join my_address a on u.username = a.username where a.id = ( select max(id) from my_address a where a.username = u.username );
select u.*, a.id, a.address
from my_user u
inner join my_address a on u.username = a.username
where a.id = (
select max(id) from my_address a where a.username = u.username
);
select * from (
select
u.username, u.name, u.surname, a.id, a.address,
row_number() over (partition by a.username order by a.id desc) rn
from my_user u
inner join my_address a on u.username = a.username
) res
where rn = 1;
下面是第二个解决方案:
select u.*, a.id, a.address
from my_user u
inner join my_address a on u.username = a.username
where a.id = (
select max(id) from my_address a where a.username = u.username
);
select * from (
select
u.username, u.name, u.surname, a.id, a.address,
row_number() over (partition by a.username order by a.id desc) rn
from my_user u
inner join my_address a on u.username = a.username
) res
where rn = 1;
你能告诉我区别吗?哪种方法最好?为什么?还有其他更好的解决方案吗
谢谢 您的两个查询都可以完成任务。没有一个比另一个更好。但是其中一个可能比另一个快,您可以通过
解释计划找到这一点。理想情况下,Oracle会为这两个查询提供相同的执行计划,但优化器很难检测到这两个查询执行相同的操作
从Oracle 12c开始,我将使用交叉应用
:
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 *
from my_address ma
where id in (select max(id) from my_address group by username)
) a on a.username = u.username;
演示:您的两个查询都可以完成任务。没有一个比另一个更好。但是其中一个可能比另一个快,您可以通过解释计划找到这一点。理想情况下,Oracle会为这两个查询提供相同的执行计划,但优化器很难检测到这两个查询执行相同的操作
从Oracle 12c开始,我将使用交叉应用
:
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 *
from my_address ma
where id in (select max(id) from my_address group by username)
) a on a.username = u.username;
演示:您比较过他们的解释计划吗?有什么区别吗?(我猜查询2的性能更好。)两者都有效还是存在问题?这不是一个代码审查网站,所以请更具体地说明您的问题。没有问题,我想知道在性能和成本方面有哪些差异。您比较过他们的解释计划吗?有什么区别吗?(我猜查询2的性能更好。)两者都有效还是存在问题?这不是一个代码审查网站,所以请更具体地说明您的问题。没有问题,我想知道在性能和成本方面有哪些区别