查询匹配所有子查询列表的唯一数据

时间:2014-10-13 10:53:37

标签: sql sql-server

我有两个名为“membership”和“限制”的表。

表:会员资格

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

表:限制   名为限制的表格具有受限制的GroupID以及该组受限制的相应ContentID。

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

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

即。 与UserID = 605的示例数据一样,组ID为“10001,10002,10003”,我需要获取为用户605列出的所有组ID限制的ContentID。

在这种情况下,预期的ContentID是'22222'。

最终目标是获取ContentID的列表,该列表在该UserID的所有组中受到限制。如果ContentID不受组中的任何一个限制,则contentID不再被视为受限制。

2 个答案:

答案 0 :(得分:1)

以下内容列出了任何组限制的所有内容:

SELECT m.UserID, r.GroupId, r.ContentID
FROM Membership m JOIN
     Restricted r
     ON m.GroupID = r.GroupID
WHERE m.UserID = 605;

要在所有组中限制内容,您可以计算群组数量,并确保每个群组都有代表:

WITH ugr AS (
      SELECT m.UserID, r.GroupId, r.ContentID
      FROM Membership m JOIN
           Restricted r
           ON m.GroupID = r.GroupID
      WHERE m.UserID = 605
     )
SELECT UserId, ContentId
FROM ugr
GROUP BY UserId, ContentId
HAVING COUNT(DISTINCT GroupId) = (SELECT COUNT(DISTINCT GroupId) FROM ugr);

答案 1 :(得分:0)

select contentid from Restriction rec join 
(
select COUNT(*) OVER () as totalGroups, groupid from Membership
where userid=605) as userMembership 
 on userMembership.groupid=rec.GroupId
group by ContentId,totalGroups
having count(*)=totalGroups