2015-04-23 46 views
0

我覺得我應該可以得到這個,我只是有一個腦屁。我已將問題簡化爲以下示例:查找不包含所有記錄的組

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

這種要求只是自動觸發一個WHERE NOT EXISTS在我的大腦反應.... –

回答

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 
) 
); 

如何閱讀?

我想在@B所有不同GroupIDs針對存在@A一個記錄,它沒有在@B具有相同@A.ID

在事實的紀錄,這是「剩女」的關係部門。

+0

d '哦!對。這是我嘗試構建的語法。但由於某種原因,它只是沒有到我這裏來。 (我想,請休息一下。)謝謝大家! – DeadZone

+0

@DeadZone:沒問題。我想大多數人(包括我自己)都需要在每次需要時查看。但請記住「關係分割」這個詞。這很容易谷歌 –

+0

是的,我從來沒有見過這個詞,以前。我將不得不花一點時間檢查該wiki頁面。 :) – DeadZone

2

試試這個

SELECT GroupID ,COUNT(GroupID) 
    FROM @a INNER JOIN @b 
    ON @[email protected] 
    GROUP BY GroupID 
    HAVING COUNT(GroupID)<(SELECT count(*) FROM @a) 
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 
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 
相關問題