我正在尝试在我的链接表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执行查询,但我不认为这与问题有关
答案 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)