查找不包含所有记录的组

时间:2015-04-23 18:33:29

标签: sql sql-server-2008

我觉得我应该能够得到这个而且我只是有一个大脑放屁。我已将问题简化为以下示例:

DECLARE @A TABLE (ID int);
DECLARE @B TABLE (GroupID char(1), ID int);

INSERT @A VALUES (1);
INSERT @A VALUES (2);
INSERT @A VALUES (3);

INSERT @B VALUES ('X', 1);
INSERT @B VALUES ('X', 2);
INSERT @B VALUES ('X', 3);

INSERT @B VALUES ('Y', 1);
INSERT @B VALUES ('Y', 2);

INSERT @B VALUES ('Z', 1);
INSERT @B VALUES ('Z', 2);
INSERT @B VALUES ('Z', 3);
INSERT @B VALUES ('Z', 4);

因此表A包含一组记录。表B包含A中包含的组ID的多个副本。但是其中一些组可能缺少该组的一个或多个记录。我想找到缺少记录的组。所以在上面的例子中,我的结果应该是:

GroupID
-------
Y

但出于某种原因,我今天无法绕过这个。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

relational division令人敬畏的用例! (Here's a must-read blog post about it

SELECT DISTINCT b1.GroupID
FROM @B b1
WHERE EXISTS (
  SELECT 1 
  FROM @A a
  WHERE NOT EXISTS (
    SELECT 1
    FROM @B b2
    WHERE b1.GroupID = b2.GroupID
    AND b2.ID = a.ID
  )
);

如何阅读?

  

我希望GroupIDs中的所有不同@B @A中有@B中的记录,@A.ID中的记录与{{1}}中的记录不同{{1}} }}

事实上,这是关系师的“剩余部分”。

答案 1 :(得分:2)

试试这个

   SELECT GroupID ,COUNT(GroupID )
    FROM @a INNER JOIN @b
    ON @a.id=@b.id
    GROUP BY GroupID 
    HAVING COUNT(GroupID )<(SELECT count(*) FROM @a)

答案 2 :(得分:0)

这将为您提供所有缺失的组合。

select FullList.*
from (select distinct a.ID,
             b.GroupId
             from @A a
             cross join @B b) FullList
left join @B b
on FullList.ID = b.ID
and FullList.GroupID = b.GroupID
where b.ID is null

你的问题的答案将是相同的,但第一行:

select distinct FullList.GroupID

答案 3 :(得分:0)

这将为您提供所有缺失的组合。

  select FullList.*
  from (select distinct a.ID,
                      b.GroupId
        from @A a
        cross join (select distinct db.GroupId from @B db) b
       ) as FullList
  left join @B b
  on FullList.ID = b.ID
  and FullList.GroupID = b.GroupID
  where b.ID is null

你的问题的答案将是相同的,但第一行:

select distinct FullList.GroupID