以下是我几天试图解决的问题的简化示例,并且与我之前提出的问题有关,但我在这个问题中增加了问题范围。
在此示例中,问题可以包含多个联系人,联系人可以有多个角色。
我希望仅在至少一个联系人具有RoleID = 4的角色时才显示结果。这意味着我希望查看问题的所有联系人和角色,但问题必须至少有一个联系人,其中RoleID = 4。
SELECT
i.ID, i.Date, c.Name, r.RoleID, r.RoleName
FROM
Issue i
INNER JOIN
Contact c ON c.IssueID = i.ID
INNER JOIN
Role r ON r.ContactID = c.ID
如果重要的话,这是在SQL Server 2000上。而且,是的,我知道不再支持SQL Server 2000,使用寿命结束,使用危险和不负责任等等;但是服务器将在今年晚些时候由另一个部门进行升级,而且它的使用目前已经无法控制。
答案 0 :(得分:0)
我想仅在至少有一个联系人具有角色时才显示结果 RoleID = 4.这意味着我想查看所有联系人和角色 问题,但问题必须至少有一个ContactID = 4的联系人。
我会使用EXISTS
来过滤问题列表。
SELECT
i.ID, i.Date, c.Name, r.RoleID, r.RoleName
FROM
Issue i
INNER JOIN
Contact c ON c.IssueID = i.ID
INNER JOIN
Role r ON r.ContactID = c.ID
WHERE EXISTS (
SELECT *
FROM Contact c1 ON c1.IssueID = i.ID
INNER JOIN
Role r1 ON r1.ContactID = c1.ID
AND r1.RoleID = 4
)
不判断你对SQL 2000的看法,但......你有计划下车吗?现在下载免费的Express版本并进行升级甚至尝试免费的云解决方案非常简单
答案 1 :(得分:0)
您可以使用聚合和having
:
SELECT i.ID
FROM Issue i INNER JOIN
Contact c
ON c.IssueID = i.ID INNER JOIN
Role r
ON r.ContactID = c.ID
GROUP BY i.ID
HAVING SUM(CASE WHEN r.RoleId = 4 THEN 1 ELSE 0 END) > 0;
如果您需要其他列,可以将这些列加入。
答案 2 :(得分:0)
另一个解决方案: 如果有多个RoleID = 4的联系人,只需将两个以上的联接添加到相同的联系人/角色表+ DISTINCT以删除重复项:
abind::adrop(a, drop = 3)
## B
## A b
## a 1