繁体   English   中英

具有复杂联接的sql查询以获取唯一记录列表

[英]sql query with complicated join to get unique records list

我需要一个查询,通过应用以下情况选择具有正确cardId的客户表。

如果您有任何建议,请分享。

可能的情况是:

  1. 仅找到一条记录-轻松,使用找到的Card_id
  2. 找不到记录-留空
  3. 找到多个记录-如果可用,请使用以2000开头的Card_id,否则请选择一个具有最新创建日期的记录(在CustomerCards表中)

客户表:

ID        CardID
1         200132
2         263987
3         100789
..

客户卡表

CustomerId         CardID        CreatedOn
1                  209890        12/11/2014
1                  200132        12/12/2014 
1                  100732        11/10/2014
2                  168902        12/11/2014
2                  263987        15/01/2015

我从左联接开始:

select ct.* from dbo.Customer ct
left join dbo.CustomerCard cc
on ct.id = cc.customerId

在那之后卡住了一点。

开始

;with cte1 as
(
select cc.CustomerId, cc.CardID, cc.CreatedOn
  from dbo.CustomerCard cc
 group by cc.CustomerId, cc.CardID, cc.CreatedOn 
having count(*) = 1
), cte200 as
(
select cc.CustomerId, cc.CardID, max(cc.CreatedOn)
  from dbo.CustomerCard cc
 group by cc.CustomerId, cc.CardID 
 where cc.CardID like '2000%'
)
select cte1
union
select cte2000 
union 
select ct.ID, ct.CardID, '1/1/1900' as  CreatedOn
  from dbo.Customer ct
  left join dbo.CustomerCard cc
    on ct.id = cc.customerId
 where cc.customerId is null 
union 
select cc.ID, cc.CardID, max(cc.CreatedOn)
  from dbo.CustomerCard cc 
  left join cte1  
    on cte1.customerId    = cc.customerId
  left join cte2000  
    on cte2000.customerId = cc.customerId
 where cte1.customerId    is null 
   and cte2000.customerId is null
 group by cc.ID, cc.CardID

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM