我的SQL Server 2008数据库中有4个表:
每条记录都记录在CONTACT
和CONTACT_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个有效计划,请仅返回活动计划列。
答案 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 DESC
和TOP 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'