得到连接的倒数?

Joe*_*oel 19 sql t-sql sql-server join sql-server-2005

我使用的是SQL Server 2005.我有三个表 - Users,Groups和GroupUsers.GroupUsers包含用于多对多关系的两个PK.

我有一个视图来获取组的所有用户信息,如下所示:

SELECT * FROM GroupUsers JOIN Users ON GroupUsers.UserID = Users.UserId
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM Users WHERE UserID NOT IN 
    (SELECT UserID FROM GroupUsers WHERE GroupID=@GroupID)
Run Code Online (Sandbox Code Playgroud)

但是我不想指定组,我想知道如何将其转换为加入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
     )
Run Code Online (Sandbox Code Playgroud)

Eri*_*ric 32

您可以使用a left outer join来抓取所有用户,然后吹掉任何有附加组的用户.以下查询将为您提供没有组的用户列表:

select
    u.*
from
    users u
    left outer join groupusers g on
        u.userid = g.userid
where
    g.userid is null
Run Code Online (Sandbox Code Playgroud)

如果要查找不在特定组中的所有用户:

select
    u.*
from
    users u
    left outer join groupusers g on
        u.userid = g.userid
        and g.groupid = @GroupID
where
    g.userid is null
Run Code Online (Sandbox Code Playgroud)

只会排除该特定组中的用户.其他所有用户都将被退回.这是因为groupid条件是在join子句中完成的,它限制了连接的行,而不是返回的,这是where子句的作用.


sha*_*esh 2

如果我理解正确,您将必须对用户和组进行笛卡尔结果,并减少从 GroupUsers 派生的结果。

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

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