连接表上的SQL Server 2000条件

时间:2016-08-08 23:27:38

标签: sql sql-server tsql join

以下是我几天试图解决的问题的简化示例,并且与我之前提出的问题有关,但我在这个问题中增加了问题范围。

在此示例中,问题可以包含多个联系人,联系人可以有多个角色。

我希望仅在至少一个联系人具有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,使用寿命结束,使用危险和不负责任等等;但是服务器将在今年晚些时候由另一个部门进行升级,而且它的使用目前已经无法控制。

3 个答案:

答案 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