Sql 连接两个表,取最大值的表

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 );

我想以一对多的关系连接两个表,但在第二个表中只选择一行,即在第二个表的第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 * 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的性能更好。)两者都有效还是存在问题?这不是一个代码审查网站,所以请更具体地说明您的问题。没有问题,我想知道在性能和成本方面有哪些区别