我觉得我应该能够得到这个而且我只是有一个大脑放屁。我已将问题简化为以下示例:
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
但出于某种原因,我今天无法绕过这个。任何帮助将不胜感激。
答案 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