SQL集(相交,联合和不)

时间:2017-09-20 19:48:01

标签: sql left-join outer-join right-join

我看起来似乎是一个简单的查询,但暗示我的布尔挑战的思想(今天没有足够的java(液体种类))。

三张桌子:

  • Users =(UserID,Username,Enabled,LoggedIn,SessionID,Email,SettingsTableVersion,FullName,Initials,UserData,InitialStatusID)

  • Groups =(GroupID,Groupname,Description,AutoAdd)

  • GroupMembers =(GroupID,UserID,ProjectID,IsMember)

我有一大堆用户和十几个小组。我有一个拥有每个用户的世界组。我有一个终止用户组,其中只有4个用户。

我想要的是查看World(每个人都在其中)并取出Terminated User组用户名的查询。这让我成为所有活跃用户! Blimey,如果这不是让我把头发拉出来的话。我推测它本质上是世界减去世界和终止用户的交集。到目前为止没有运气。 SQL Server 2012。

TIA

3 个答案:

答案 0 :(得分:3)

嵌套查询?

Select * 
from users 
where userid not in ( select userid 
                      from groupmembers 
                      where groupid=[terminated])

或者那太慢了?

答案 1 :(得分:0)

如果我可以假设

  1. 组名是'world'和'terminatedusers'
  2. 组成员中不存在重复项(groupID和userID是唯一索引)
  3. 你的意思是世界是所有用户都是一个终止的用户,并不存在于世界组中。
  4. SELECT U.userID
    FROM USERS U
    INNER JOIN GROUPMEMBERS GM
      on U.UserID = GM.UserID
    INNER JOIN GROUPS G
     on G.GroupID = GM.GroupID
    WHERE GroupName in ('World', 'TerminatedUsers')
    GROUP BY U.UserID 
    HAVING count(GM.GroupID) = 1
    

    这基本上可以找到每个用户所在的两个组的所有组。那么只返回那些只有一组的人。

    您也可以加入两个已定义的集合:

    SELECT U.userID
    FROM Users U
    INNER JOIN GroupMembers GMWorld
      on U.userID = GMWorld.userID
     and GMWorld.GroupID = [ID for world]
    LEFT JOIN GroupMembers GMTerminated
      on U.userID = GMTerminated.UserID
     and GMTerminated.GroupID = [ID for terminated]
    WHERE GMTerminated.userID is null
    

    如果您不想使用ID,您可以将两次加入Group for GMterminated和GMWorld来使用这些名称。

    第二个查询基本上将用户连接到一个世界集和一个终止集,我们将所有用户保留在世界中,除了那些在终止集中有记录的用户。

答案 2 :(得分:0)

这个就行了!问题是我有一个用户被删除(翻转启用位),然后重新添加,所以他们出现在列表中,直到我添加Enabled = 1.再次感谢xQbert ...太棒了。

SELECt fullname
    FROM Users U
    LEFT JOIN GroupMembers GMWorld
      on U.userID = GMWorld.userID
     and GMWorld.GroupID = 3
    LEFT JOIN GroupMembers GMTerminated
      on U.userID = GMTerminated.UserID
     and GMTerminated.GroupID = 14
    WHERE GMTerminated.userID is null and Enabled = 1