几张有重复记录的表关联查询取最新的记录,如何优化?

tinren 2010-06-04 09:50:22
table_a
----------------------
id orderNum value
1 a001 v001
2 a001 v002


table_b
----------------------
id orderNum status
1 a001 a
2 a001 b
3 a001 c
4 b001 d
5 b001 e

这是我想到的办法,虽然可以运行,可是在table_b表的数据很多的时候,效率很慢,目前测试20多万的数据,感觉速度已经不可接受。请高手支招!!!谢谢了。

select * from table_a a,
(select * from table_b b where b.id in(select max(id) from table_b c group by orderNum)) d

where a.orderNum=d.orderNum
...全文
110 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
minoboy 2010-06-04
  • 打赏
  • 举报
回复
where (ordernum,id) in(select ordernum, max(id) id from table_b c group by orderNum)

并对(ordernum,id)建立复合索引,速度肯定是超快.
minoboy 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 tinren 的回复:]
select * from table_a a,
(select * from table_b b where b.id in(select max(id) from table_b c group by orderNum)) d

where a.orderNum=d.orderNum[/Quote]
逻辑有问题:where b.id in(select max(id) from table_b c group by orderNum)

取出来结果是错的.
duqiangcise 2010-06-04
  • 打赏
  • 举报
回复
select a.id,a.ordernum,a.value,b.status
from a,(
select ordernum ,status,row_number()over(partition by ordernum order by id desc)row_num
from c)b
where a.ordernum = b.ordernum and b.row_num=1;

不敢保证有你的sql效率高。你还是在执行的时候看看执行计划吧。
lzbbob1985 2010-06-04
  • 打赏
  • 举报
回复
方法一
select * from table_a a,
table_b b ,
(select max(id) id from table_b c group by orderNum)) c

where a.orderNum=d.orderNum
and b.id = c.id

方法二正在想
tinren 2010-06-04
  • 打赏
  • 举报
回复
table_a
----------------------
id orderNum value
1 a001 v001
2 b001 v002

上面的table_a应该是这个数据。

大概是这样,a,b,c,d等表以orderNum关联查询,其中可能有的表数据有重复,要求取id最大的记录

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧