sql三表关联后去重

img


同一个申请人可以对应不同的approver和不同的group
申请有多条申请记录,用sql语句是否可以去重后达到保留同一个申请人相同的approver和group只保留一条记录

img

把表结构和你最后想要的格式发出来,并说明对应关系
根据你的问题,你这个sql应该改写成下面这个样子

select distinct  
       a.UserID,
       b.Approver,
       c.GroupName
  from [ dbo ] . [ UserList ] a
  left join [ dbo ] . [ ApproverMapping ] b
    on a.GroupID = b.GroupID
  left join [ dbo ] . [ GroupMapping ] c
    on b.GroupID = c.ID
 where Approver <> ''
   and Team = 'Requester'

根据题主补充描述,可使用开窗函数结合nullif函数使上下相邻两个格子中重复数据只保留一个,其他变为空值,如下

select   nullif(c.GroupName, lag(c.GroupName) over(order by c.GroupName,a.UserID,b.Approver)) GroupName,
       a.UserID,
       b.Approver
  from  UserList  a
  left join  ApproverMapping  b
    on a.GroupID = b.GroupID
  left join  GroupMapping  c
    on b.GroupID = c.ID
 where Approver <> ''
   and Team = 'Requester'
   order by c.GroupName,a.UserID,b.Approver

下面是sqlserver实测截图

img


此方法在oracle数据库中也可以使用,参考
【ORACLE】收集一些较为少见但很有用的SQL函数及写法.part5 - DarkAthena's World-ORACLE,RETAIL and IT 接上篇【ORACLE】收集一些较为少见但很有用的SQL函数及写法.part429.ANY_VALUE作用:作为聚合函数,返回任意一个值(19c版本才添加的)。比如常见的一个查询,关联商品基础信息表和销售明细表,对销售明细进行汇总,然后同时又要显示商品编码和商品名称,大多数情况下都是这么写的selec https://www.darkathena.top/archives/oracle-sql-part5

用distinct处理不就可以吗