一尘不染

得到联接的逆向?

sql

我正在使用SQL Server2005。我有三个表-用户,组和组用户。GroupUsers包含用于多对多关系的两个PK。

我的观点是要获取组的所有用户信息,如下所示:

SELECT * FROM GroupUsers JOIN Users ON GroupUsers.UserID = Users.UserId

我想创建此视图的反面-我想要一个未附加到特定组的所有用户的列表。以下查询将完成此操作:

SELECT * FROM Users WHERE UserID NOT IN 
    (SELECT UserID FROM GroupUsers WHERE GroupID=@GroupID)

但是,我不想指定组,我想知道如何将其变成一个视图,该视图将GroupID,UsersID和所有用户信息连接在一起,但仅适用于未连接的用户。

我不确定如何执行此操作,也许使用EXCEPT运算符可以执行此操作吗?

更新:

我认为这是我的解决方案,除非有人提出更好的建议:

SELECT 
   G.GroupId,
   U.*
FROM
   Groups G
CROSS JOIN
   Users U
WHERE
   U.UserId NOT IN 
     (
        SELECT 
           UserId
        FROM
           GroupUsers
        WHERE
           GroupId=G.GroupId
     )

阅读 128

收藏
2021-03-17

共1个答案

一尘不染

如果我正确理解,则必须对用户和组进行笛卡尔运算,并减少从GroupUsers得出的结果。

这将为您提供未附加任何组的用户记录。
如果无法正确理解问题,我深表歉意。

编辑:笛卡尔结果将为您提供用户*组。您将不得不从中减去GroupUsers。抱歉,我还没有SQL的准备,目前无法尝试。

2021-03-17