LEFTJOIN分组每组排序后的第⼀条
设定:
合同表:A 唯⼀标识为ID,每个合同⼀个ID
流程表:B ⽆唯⼀标识,合同审批流程每⼀步都⽣成⼀条
AppO_Values:对应合同表的ID,
App_Order: 对应审批步骤,
UserID: 审批⼈ID
需求
查询出所有合同表,及当前审批⼈
思路
SELECT * A 然后 LEFT JOIN 流程表
问题
每个合同查询出多条记录
解决办法
对流程表按对应合同表的ID也就是AppO_Values分组,每个组取第⼀条也就是当前审批⼈
SQL语句
1. ⽅法⼀:使⽤ROW_NUMBER函数
SELECT * FROM A a LEFT JOIN (select * from (select ROW_NUMBER()over(partition by AppO_Values order by App_Order desc) rowId,* from B ) as AuctionRecords
where rowId=1) c ON = c.AppO_Values
select *
from a aa left join
b bb on aa.AppO_Values = bb.AppO_Values and bb.App_Order = (select max(App_Order) from b where AppO_Values = bb.AppO_Values )
因为不需要插⼊⼀⾏rowid所以速度理论上会快⼀点,验证
验证语句
declare @d datetime
set @d=getdate()
/*你的SQL脚本开始*/
/*你的SQL脚本结束*/
select [语句执⾏花费时间(毫秒)]=datediff(ms,@d,getdate())
⽅法⼀耗时2186
多表left join⽅法⼆耗时19660

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。