-
设定:
合同表:A 唯一标识为ID,每个合同一个ID
流程表:B 无唯一标识,合同审批流程每一步都生成一条
AppO_Values:对应合同表的ID,
App_Order: 对应审批步骤,
UserID: 审批人ID -
需求
查询出所有合同表,及当前审批人 -
思路
SELECT * A 然后 LEFT JOIN 流程表 -
问题
每个合同查询出多条记录 -
解决办法
对流程表按对应合同表的ID也就是AppO_Values分组,每个组取第一条也就是当前审批人 -
SQL语句
-
方法一:使用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 a.ID = c.AppO_Values
参考:https://blog.csdn.net/qq_16990363/article/details/53466255
https://zhidao.baidu.com/question/365822881.html
2. 方法二:使用max函数
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 )
参考:https://bbs.csdn.net/topics/350135010
因为不需要插入一行rowid所以速度理论上会快一点,验证
验证语句
declare @d datetime
set @d=getdate()
/*你的SQL脚本开始*/
/*你的SQL脚本结束*/
select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
方法一耗时2186
方法二耗时19660