-
設定:
合同表: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
另,驗證語句位址:https://www.cnblogs.com/xcsn/p/7773212.html