我看起来似乎是一个简单的查询,但暗示我的布尔挑战的思想(今天没有足够的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
答案 0 :(得分:3)
嵌套查询?
Select *
from users
where userid not in ( select userid
from groupmembers
where groupid=[terminated])
或者那太慢了?
答案 1 :(得分:0)
如果我可以假设
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