2012-06-05 11 views
1

我想從一個匹配的表中取回結果全部指定值在指定值位於另一個表中。我可以這樣做:如何返回沒有多個EXISTS子句的表中匹配的行?

SELECT * FROM Contacts 
WHERE 
EXISTS (SELECT 1 FROM dbo.ContactClassifications WHERE ContactID = Contacts.ID AND ClassificationID = '8C62E5DE-00FC-4994-8127-000B02E10DA5') 
AND EXISTS (SELECT 1 FROM dbo.ContactClassifications WHERE ContactID = Contacts.ID AND ClassificationID = 'D2E90AA0-AC93-4406-AF93-0020009A34BA') 
AND EXISTS etc... 

但是,當我達到約40個EXISTS子句時,就會發生。錯誤消息是「查詢處理器耗盡內部資源並且無法生成查詢計劃,這是一種罕見事件,並且只適用於引用大量表或分區的極其複雜的查詢或查詢,請簡化查詢「。

+0

如何接觸只需在ClassificationID上使用IN子句? – Limey

+1

IN子句的問題在於它與任何ClassificationID匹配。我希望它匹配所有分類ID – Colin

回答

6

這樣做的主旨是

  • 選擇與任何GUID的所有聯繫人從IN聲明
  • 使用一個DISTINCT COUNT獲得匹配的GUID的每個contactid的計數
  • 使用HAVING只保留那些等於匹配的GUID的你已經投入IN帳單上的金額

SQL語句

SELECT * 
FROM dbo.Contacts c 
     INNER JOIN (
      SELECT c.ID 
      FROM dbo.Contacts c 
       INNER JOIN dbo.ContactClassifications cc ON c.ID = cc.ContactID 
      WHERE cc.ClassificationID IN ('..', '..', 38 other GUIDS) 
      GROUP BY 
       c.ID 
      HAVING COUNT(DISTINCT cc.ClassificationID) = 40 
     ) cc ON cc.ID = c.ID 

測試腳本在data.stackexchange

+0

OP詢問「所有值在另一個表中」,不是所有的值都傳遞給查詢,然後放在IN子句中 – Andomar

+0

對不起。我將編輯我的問題。我想要所有指定的值。 – Colin

+0

如果你的輸入是一個GUID列表,那麼這是一個正確的答案:) – Andomar

3

一個解決方案是要求沒有匹配聯繫人的情況下不存在分類。這是雙重否定:

select * 
from contacts c 
where not exists 
     (
     select * 
     from ContactClassifications cc 
     where not exists 
       (
       select * 
       from ContactClassifications cc2 
       where cc2.ContactID = c.ID 
         and cc2.ClassificationID = cc.ClassificationID 
       ) 
     ) 

這種類型的問題被稱爲relational division

+0

...不知道這是否正確,但最終有人閱讀問題和他的意見! – Gerrat

+0

您需要他的分類ID列表 – Gerrat

+0

@Gerrat:查詢要求聯繫人具有ContactClassifications表中的所有分類。正如問題所要求的,「所有值在另一個表」 – Andomar

0
SELECT c.* 
FROM Contacts c 
INNER JOIN 
(cc.ContactID, COUNT(DISTINCT cc.ClassificationID) as num_class 
    FROM ContactClassifications 
    WHERE ClassificationID IN (....) 
    GROUP BY cc.ContactID 
) b ON c.ID = b.ContactID 
WHERE b.num_class = [number of distinct values - how many different values you put in "IN"] 

如果您運行的SQLServer 2005及更高版本,你可以做幾乎同樣與CROSS APPLY,據說更有效地

相關問題