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

  • 设定:
    合同表: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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值