sql条件连接得到错误的结果

时间:2013-11-14 09:22:24

标签: sql sql-server-2008 join

我正在尝试在我的链接表userGroup上加入表组,以获取ID为30的用户不是其成员的组,但我似乎无法正确使用。

无条件加入会返回此

SELECT        Groups.ID, Groups.Name, UserGroup.groupID, UserGroup.userID
FROM            Groups LEFT OUTER JOIN  UserGroup ON Groups.ID = UserGroup.groupID
+----------+------------+-------------------+------------------+
| Group.ID | Group.Name | UserGroup.GroupID | userGroup.UserID |
+----------+------------+-------------------+------------------+
|        1 | g1         | 1                 | 30               |
|        2 | g2         | NULL              | NULL             |
+----------+------------+-------------------+------------------+

然而,当我试图找出userID = 30的行时,我得到两个同样错误的结果。 在连接部分中添加条件会返回两行,但声称userGroup.userId为null。我怀疑由于加入而导致一些重复的行,但是无法确定究竟是什么以及如何解决它

SELECT        Groups.ID, Groups.Name, UserGroup.groupID, UserGroup.userID
FROM            Groups LEFT OUTER JOIN  UserGroup ON Groups.ID = UserGroup.groupID AND UserGroup.userID <> 30
+----------+------------+-------------------+------------------+
| Group.ID | Group.Name | UserGroup.GroupID | userGroup.UserID |
+----------+------------+-------------------+------------------+
|        1 | g1         | NULL              | NULL             |
|        2 | g2         | NULL              | NULL             |
+----------+------------+-------------------+------------------+

将条件添加到我的语句的最后,返回0行。

SELECT Groups.ID, Groups.Name, UserGroup.groupID, UserGroup.userID
FROM  Groups LEFT OUTER JOIN  UserGroup ON Groups.ID = UserGroup.groupID 
WHERE UserGroup.userID <> 30

我在mssql服务器上运行并使用c#SqlCommand执行查询,但我不认为这与问题有关

3 个答案:

答案 0 :(得分:2)

你真的想加入试图找到usergroup.userID = 30的位置,而不是&lt;&gt; 30.从该连接中,您希望返回没有此类用户组记录的记录。 尝试这样的事情:

         SELECT Groups.ID, Groups.Name, UserGroup.groupID, UserGroup.userID
           FROM  Groups 
LEFT OUTER JOIN  UserGroup ON UserGroup.groupID = Groups.ID 
                          AND UserGroup.userID = 30
WHERE UserGroup.UserID IS NULL

答案 1 :(得分:2)

“获取ID为30的用户不是其成员的组”

SELECT  *
FROM  Groups g
WHERE NOT EXISTS (SELECT 1 FROM UserGroup WHERE groupID = g.iD and userID = 30);
在你的情况下,对我来说似乎更自然。

答案 2 :(得分:2)

要获取ID为30的用户不是其成员的组:

SELECT Groups.ID, Groups.Name
FROM Groups 
WHERE Groups.ID NOT IN 
(SELECT UserGroup.GroupID FROM UserGroup WHERE UserGroup.UserID = 30)