Sql Join questionn-Select只能返回一条记录

Sql Join questionn-Select只能返回一条记录,sql,sql-server,join,Sql,Sql Server,Join,我的SQL Server 2008数据库中有4个表: 联系 联络单位详情 计划 计划及详情 每个记录都记录在CONTACT和CONTACT_DATAILS中,但一个联系人在计划中可以有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 in

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

联系 联络单位详情 计划 计划及详情 每个记录都记录在CONTACT和CONTACT_DATAILS中,但一个联系人在计划中可以有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',它将返回两个相同的结果,但我只需要一个


在简历中:我需要一个select,它只返回我1行。如果有活动计划,则返回列;如果没有,则返回空列。如果有人有1个已取消和1个活动计划,请仅返回活动计划列。

您的问题的答案是将pp上的条件移至on子句


此外,当您有一系列内部联接和左侧联接时,我建议先放置所有内部联接,然后再放置外部联接。这就清楚了哪些连接用于保存记录,哪些用于过滤。

您的问题的答案是将pp上的条件移动到on子句

此外,当您有一系列内部联接和左侧联接时,我建议先放置所有内部联接,然后再放置外部联接。这就清楚了哪些联接用于保存记录,哪些联接用于过滤。

只需添加一个ORDER BY PP.STATUS DESC和一个TOP 1子句,然后删除和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
只需添加一个orderby PP.STATUS DESC和一个TOP 1子句,然后删除和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
选择* 来自联系人c

左连接 从中选择* 选择 [此表中您需要的任何内容] ,按[此表中的键]按状态asc rnk排序的行数超额分配 从计划 其中rnk=1 聚丙烯 关于pp.PKEY=c.PKEY

左连接计划\u详细信息pd on pd.PDKEY=p.PDKEY

内部连接联系人详细信息cd 在cd.DKEY=c.DKEY上

其中c.KEY='100003'

选择* 来自联系人c

左连接 从中选择* 选择 [此表中您需要的任何内容] ,按[此表中的键]按状态asc rnk排序的行数超额分配 从计划 其中rnk=1 聚丙烯 关于pp.PKEY=c.PKEY

左连接计划\u详细信息pd on pd.PDKEY=p.PDKEY

内部连接联系人详细信息cd 在cd.DKEY=c.DKEY上


其中c.KEY='100003'

我希望你能读到这篇文章,我在格式化时遇到了一个问题,因此它是可读的,但本质上它将做什么,将对状态进行排序,如果有数据,当你说rnk=1时,它将首先给你活动行,否则它将返回该记录的空行。Tony,谢谢!这是一个好主意,只加入第一行。可能对我正在做的其他事情有用。但这与“选择”中的前1行的效果不同:我需要一个只返回1行的选择。如果有活动计划,则返回列;如果没有,则返回空列。如果有人有1个已取消计划和1个活动计划,请仅返回活动计划列。“-这应该通过在筛选状态的联接中包含行号来实现。如果有一个活动状态,它将向您提供该信息,如果没有活动行,它将向您提供它在那里的任何行,而不是HeadCancelled或Null我希望您可以阅读此信息,我有一个格式化问题,所以它是可读的,但本质上它将做什么将排名状态,如果有数据,它将给你活动行首先当你说rnk=1,否则它将返回空行的记录。托尼,谢谢!这是一个好主意,只加入第一行。可能对我正在做的其他事情有用。但这与“选择”中的前1行的效果不同:我需要一个只返回1行的选择。如果有活动计划,则返回列;如果没有,则返回空列。如果有人有1个已取消计划和1个活动计划,请仅返回活动计划列。“-这应该通过在筛选状态的联接中包含行号来实现。如果有一个活动状态,它将向您提供该信息。如果没有活动行,它将向您提供它在那里的任何行,而不是取消或为空。这几乎是我所需要的,但是只有取消计划的联系人将显示所有计划信息,但它不应该显示。但是谢谢你!你的帮助加上戈登的回答就成功了!这几乎是我所需要的,但是只有取消计划的联系人才会显示所有计划信息,但它不应该显示。但是谢谢你!你的帮助加上戈登的回答就成功了!非常感谢。我从不在连接的中间使用条件。刚刚学了一个新东西,谢谢。我从不在连接的中间使用条件。刚学到一件新东西。