LEFT JOIN 分组每组排序后的第一条

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_21703215/article/details/81976575
  • 设定:
    合同表: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 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

展开阅读全文

没有更多推荐了,返回首页