2014-10-10 41 views
0

我有两个表,分别称为“membership”和“restricted”。查询匹配子查询的所有数据和所有数据的表也应该与普通数据匹配

表:成员

+---------+--------+ 
| GroupID | UserID | 
+---------+--------+ 
| 10001 | 605 | 
| 10001 | 255 | 
| 10002 | 605 | 
| 10004 | 222 | 
| 10003 | 605 | 
| 10002 | 501 | 
+---------+--------+ 

表:限制 表称为限制是具有受限制的GroupID和对应的内容识别给该组被限制。

+---------+-----------+ 
| GroupID | ContentId | 
+---------+-----------+ 
| 10001 |  33333 | 
| 10001 |  22222 | 
| 10002 |  22222 | 
| 10004 |  44444 | 
| 10003 |  22222 | 
| 10002 |  44444 | 
+---------+-----------+ 

我想从受限制的表中获取用户标识所属的所有组的ContentID。

即。 正如在UserID = 605的示例数据中,组ID是“10001,10002,10003”,我需要获得对用户605列出的所有组ID的限制的ContentID。

预期的ContentID in这个案例是'22222'。

最终目标是获取ContentID的列表,该列表在该用户标识的所有组中都受到限制。如果ContentID在组中没有任何限制,那么contentID不再被视为受限制。

+0

选择\t内容识别FROM限制WHERE群ID IN(SELECT GroupID从成员身份WHERE用户ID = 505) – user4130072 2014-10-10 16:10:47

+0

但它在这里获得记录它会插入任何一个组ID,因为我正在使用IN – user4130072 2014-10-10 16:11:27

+0

在成员和组之间建立适当的多对多关系,并且此任务将变得微不足道。如果你不明白我刚才所说的话,我已经听说过关于这本书的数据库设计的一些好消息。 – 2014-10-10 16:18:01

回答

0

最好不知道表的结构,我可以这样做:

Select ContentID, * 
From [DatabaseName].dbo.Members M 
JOIN [DatabaseName].dbo.Restricted R on R.GroupID = M.GroupID 
WHERE M.GroupID = 505 
0

如何:

SELECT DISTINCT M.userid, R.contentid 
FROM restriction R 
INNER JOIN membership M 
    ON M.groupid = R.groupid 
WHERE (SELECT COUNT(DISTINCT groupid) FROM membership M2 WHERE M2.userid = M.userid) = 
     (SELECT COUNT(DISTINCT groupid) FROM restriction R2 WHERE R2.contentid = R.contentid) 

回报:

UserId ContentId 
------ --------- 
255  33333  
605  22222