1

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

无条件加入返回此

SELECT        Groups.ID, Groups.Name, UserGroup.groupID, UserGroup.userID
FROM            Groups LEFT OUTER JOIN  UserGroup ON Groups.ID = UserGroup.groupID
+----------+------------+---------+-- -------------+
| 组.ID | 组名 | 用户组.GroupID | 用户组.用户 ID |
+----------+------------+---------+-- -------------+
| 1 | g1 | 1 | 30 |
| 2 | g2 | 空 | 空 |
+----------+------------+---------+-- -------------+

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

SELECT        Groups.ID, Groups.Name, UserGroup.groupID, UserGroup.userID
FROM            Groups LEFT OUTER JOIN  UserGroup ON Groups.ID = UserGroup.groupID AND UserGroup.userID <> 30
+----------+------------+---------+-- -------------+
| 组.ID | 组名 | 用户组.GroupID | 用户组.用户 ID |
+----------+------------+---------+-- -------------+
| 1 | g1 | 空 | 空 |
| 2 | g2 | 空 | 空 |
+----------+------------+---------+-- -------------+

将条件添加到我的语句的最后,返回 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 执行查询,但我认为这与问题无关

4

3 回答 3

2

您实际上想要加入尝试查找 usergroup.userID = 30,而不是 <> 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
于 2013-11-14T09:31:37.377 回答
2

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

SELECT  *
FROM  Groups g
WHERE NOT EXISTS (SELECT 1 FROM UserGroup WHERE groupID = g.iD and userID = 30);

在你的情况下,对我来说似乎更自然。

于 2013-11-14T09:32:55.983 回答
2

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

SELECT Groups.ID, Groups.Name
FROM Groups 
WHERE Groups.ID NOT IN 
(SELECT UserGroup.GroupID FROM UserGroup WHERE UserGroup.UserID = 30)
于 2013-11-14T09:36:30.400 回答