full join 时通过辅助列序号列消除笛卡尔积重复列

如果没有序号列,那么如果领灯表里有3条数据,还灯表里面有2条数据,full join后就是3*2=6条数据

--1、领灯表,每天每班每人允许重复数据
select ID
      ,ROW_NUMBER() over(partition by PersonID,classid,dt_ClassData order by id)  as  getnum
      ,[PersonID]
      ,[ClassID]
      ,[dt_GetTime]
      ,[dt_ClassData]
from   m_LampHistoryDataGet as a
order by  PersonID,dt_GetTime

--2、还灯表,每天每班每人允许重复数据
select ID
      ,ROW_NUMBER() over(partition by PersonID,classid,dt_ClassData order by id)  as  getnum
      ,[PersonID]
      ,[ClassID]
      ,[dt_ReturnTime]
      ,[dt_ClassData]
from   v_LampHistoryDataReturn as a
order by  PersonID,dt_ReturnTime
--3、整合表,要求领灯时间与还灯时间按照顺序一一对应,第一条领灯数据对应第一条还灯数据
SELECT 
      laGet.id as GetID
      ,laReturn.ID as ReturnID
      ,coalesce(laGet.getnum,laReturn.returnnum) as num
      ,coalesce(laGet.PersonID,laReturn.PersonID) as PersonID  
      ,laGet.[dt_GetTime]
      ,laReturn.dt_ReturnTime
      ,coalesce(laGet.ClassID,laReturn.ClassID) as classid
      ,coalesce(laGet.dt_ClassData,laReturn.dt_ClassData) as dt_ClassData
      
FROM         dbo.v_LampHistoryDataGet AS laGet 
full join dbo.v_LampHistoryDataReturn  laReturn 
on  laGet.PersonID=laReturn.PersonID 
and laGet.dt_ClassData=laReturn.dt_ClassData 
and laGet.ClassID=laReturn.ClassID
and  laGet.getnum= laReturn.returnnum
order by  PersonID,coalesce(dt_GetTime,dt_ReturnTime) 
--按照人员,领灯时间排序
END 
  

  

 

 

 

..

转载于:https://www.cnblogs.com/xiaochun126/p/4226646.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值