首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有复杂联接的sql查询以获得唯一记录列表

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

Stack Overflow用户
提问于 2015-02-26 12:10:24
回答 1查看 74关注 0票数 0

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

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

可能出现的情况如下:

  1. 只找到一个记录-容易,使用Card_id找到
  2. 没有发现任何记录-留空
  3. 找到多条记录--如果可用的话,使用从2000年开始的Card_id,否则选择具有最新创建日期的记录(在CustomerCards表中)

顾客表:

代码语言:javascript
运行
复制
ID        CardID
1         200132
2         263987
3         100789
..

CustomerCards表

代码语言:javascript
运行
复制
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

我从“左加入”开始:

代码语言:javascript
运行
复制
select ct.* from dbo.Customer ct
left join dbo.CustomerCard cc
on ct.id = cc.customerId

在那之后有点卡住了。

EN

回答 1

Stack Overflow用户

发布于 2015-02-26 14:41:29

一个开始

代码语言:javascript
运行
复制
;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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28742115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档