求问一个left join 右表多条记录取其中一个的问题

gdufs_nico 2017-05-05 11:44:21
大家好,现在有两个表,主表Mstb_Order_Header和右表mstb_order_header_extend_atl,两个表用order_number关联起来,但是右表的order_number可能对应多条记录,这多条记录的carrier_type值其实是同一个,只要取其中一条的carrier_type值就好了。下面是SQL


第一条SQL

select oh.*,hea.carrier_type from Mstb_Order_Header oh
left join (select order_number,max(carrier_type) as carrier_type from mstb_order_header_extend_atl group by order_number) hea
on oh.order_number = hea.order_number;


第二条SQL

select oh.*,hea.carrier_type from Mstb_Order_Header oh
left join (select order_number,carrier_type from mstb_order_header_extend_atl where rownum = 1) hea
on oh.order_number = hea.order_number;


现在发现两条SQL都能满足业务需求,我不明白的是第二条SQL,我理解的第二条SQL,右表应该是只要一条记录和主表匹配,就是应该先执行了select order_number,carrier_type from mstb_order_header_extend_atl where rownum = 1 在和主表关联。


两条SQL的执行计划如下:
第一条


第二条



我想问一下具体执行的逻辑如何理解?
...全文
4505 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
两条语句 并不能达到一样的效果
卖水果的net 2017-05-05
  • 打赏
  • 举报
回复
这两条语句,并不等价;

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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