加入问题 - 选择必须只返回一条记录

时间:2015-04-13 19:17:27

标签: sql sql-server join

我的SQL Server 2008数据库中有4个表:

  • 联系
  • CONTACT_DETAILS
  • PLANS
  • PLANS_DETAILS

每条记录都记录在CONTACTCONTACT_DATAILS中,但CONTACT可以在PLANS,有效或已取消的记录中包含0,1,2或更多记录。

所以我这样做了:

SELECT * 
from CONTACT as c
left join PLANS as pp on pp.PKEY = c.PKEY
left join PLANS_DETAILS as pd on pd.PDKEY = p.PDKEY
inner join CONTACT_DETAILS as cd on cd.DKEY = c.DKEY
WHERE c.KEY = '267110' and PP.STATUS = 'Active'

" 267110"有一个活跃的计划,所以它显示我一行,我需要的一切。

但如果我把

WHERE c.KEY = '100003' and PP.STATUS = 'Active'

" 100003"有2个取消的计划,所以结果是空的。如果我删除 PP.STATUS =' Active' ,它会返回2个相同的结果,但我只需要一个。

简历中:我需要一个只返回1行的选择。如果存在活动计划,则返回列,否则返回列null。如果有人有1个已取消和1个有效计划,请仅返回活动计划列。

3 个答案:

答案 0 :(得分:3)

您的问题的答案是将pp上的条件移至on条款。

SELECT *
from CONTACT c inner join
     CONTACT_DETAILS cd
     on cd.DKEY = c.DKEY left join
     PLANS pp
     on pp.PKEY = c.PKEY AND PP.STATUS = 'Active' left join
     PLANS_DETAILS pd
     on pd.PDKEY = p.PDKEY
WHERE c.KEY = '267110' ;

此外,当你有一系列内连接和左连接时,我建议先放入所有内连接,然后再连接外连接。这清楚地表明哪些连接用于保存记录以及哪些连接用于过滤。

答案 1 :(得分:1)

只需添加ORDER BY PP.STATUS DESCTOP 1子句,然后删除and PP.STATUS = 'Active',就像这样

SELECT TOP 1 * from CONTACT as c
left join PLANS as pp on pp.PKEY = c.PKEY
left join PLANS_DETAILS as pd on pd.PDKEY = p.PDKEY
inner join CONTACT_DETAILS as cd on cd.DKEY = c.DKEY

WHERE c.KEY = '100003' 
ORDER BY PP.STATUS DESC

答案 2 :(得分:0)

SELECT *    来自CONTACT c

左连接    (       选择*来自         (选择         [无论你需要什么,从这张桌子]         ,row_number over(按[此表中的键]分区顺序按状态asc)rnk       来自PLANS)       其中rnk = 1    )pp    在pp.PKEY = c.PKEY

左连接PLANS_DETAILS pd    在pd.PDKEY = p.PDKEY

内部联接CONTACT_DETAILS cd    在cd.DKEY = c.DKEY

WHERE c.KEY ='100003'