【问题标题】:SQL Server 2000 join with count conditionSQL Server 2000 加入计数条件
【发布时间】:2016-12-14 16:03:55
【问题描述】:

我要加入多个表。对于我的一个连接(1 到多个),我只想在连接表至少有一行存在某个值的情况下才显示结果。

此示例排除了其他连接,因此为简单起见:

SELECT 
    c.Name, r.RoleID, r.RoleName
FROM 
    Contact c
INNER JOIN
    Role r ON r.ContactID = c.ID

一个联系人可以有多个角色。我想显示联系人的所有角色,但只获取至少一个角色具有 RoleID = 4 的联系人。我已经尝试了一些事情,但到目前为止没有成功。如果重要的话,这是在 SQL Server 2000 上。

我已将问题的范围扩大到这个新问题:SQL Server 2000 condition on joined table

【问题讨论】:

  • Sql Server 2000 已经过时了。这意味着它不再获得任何更新...甚至没有关键的安全补丁!继续使用它是危险和不负责任的。升级此服务器是第 1 项工作。
  • 我完全同意你的看法,该服务器将在今年晚些时候由另一个部门升级。
  • 我已将问题的范围扩大到这个新问题:stackoverflow.com/questions/38839917/…

标签: sql tsql join sql-server-2000


【解决方案1】:

加入两次,一次是限制 ID 4 作为过滤器,另一次是拉入所有角色:

SELECT 
    c.Name, r.RoleID, r.RoleName
FROM 
    Contact c
INNER JOIN  --if a Contact does not match any Roles with ID 4, this join will exclude that contact from the results
    Role rt /*role temp*/ ON rt.ContactID = c.ID AND rt.RoleId = 4        
INNER JOIN
    Role r ON r.ContactID = c.ID

这确实做了一个问题中没有明确说明的假设。虽然一个联系人可以有多个角色,但这假定一个联系人不会被多次分配相同的角色。

【讨论】:

  • 好点子,实际上,一个联系人可能不止一次拥有一个角色,因为角色记录上还有其他属性可以区分给定联系人的相同角色。
  • 在这种情况下,最好的选择是等待服务器升级,因为较新版本的 Sql Server 将允许您使用 APPLY 运算符进行第一次 JOIN,您可以使用它来限制自己一个结果。
  • 嗯,这不是一个真正的选择。我正在使用此查询来协助完成一项任务,而该任务已经过期了!谢谢您的意见,它可能会引导我找到解决方案。
  • 您的解决方案有效,但是当我引入其他表加入时,我遇到了并非所有返回的联系人都具有 roleID = 4 的问题,但其中一些有。您已对所提出的问题提供了有效的答案,因此值得称赞。
【解决方案2】:

你试试

SELECT 
    c.Name, r.RoleID, r.RoleName
FROM 
    Contact c
INNER JOIN
    Role r ON r.ContactID = c.ID group by c.Name, r.RoleID, r.RoleName having min(r.RoleID) = 4

【讨论】:

  • 此答案仅返回 RoleID = 4 的角色,不返回其他角色。
  • 你可以这样使用 SELECT c.Name, r.RoleID, r.RoleName FROM Contact c INNER JOIN Role r ON r.ContactID = c.ID where c.ID in (SELECT r.ContactID FROM Role r group by r.ContactID 具有 min(r.RoleID) = 4))
  • RoleID 从 1 开始,Contact 的 RoleID 可能为 1、3、4、22 等。因此,似乎“具有 min(r.RoleID) = 4)”会省略RoleID
【解决方案3】:

你可以使用EXISTS:

SELECT 
    c.Name, r.RoleID, r.RoleName
FROM 
    Contact c
INNER JOIN
    Role r ON r.ContactID = c.ID
WHERE EXISTS(SELECT 1 FROM Role 
             WHERE RoleID = 4
             AND ContactID = c.ID);

【讨论】:

  • 您的解决方案也有效,但是当我引入其他表加入时,我遇到了并非所有返回的联系人都具有 roleID = 4 的问题,但其中一些确实如此。您已对所提出的问题提供了有效的答案,因此值得称赞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多