如何在没有多个EXISTS子句的情况下返回表中匹配的行?

Col*_*lin 1 sql t-sql sql-server

我想从一个表中拉回结果,该表匹配指定值在另一个表中的所有指定值.我可以这样做:

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...
Run Code Online (Sandbox Code Playgroud)

然而,当我达到约40个EXISTS条款时,这就会失败.错误消息是"查询处理器耗尽了内部资源,无法生成查询计划.这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询.请简化查询".

Lie*_*ers 6

这个的要点是

  • IN语句中选择具有任何GUID的所有联系人
  • 使用a DISTINCT COUNT来获取匹配GUID的每个contactid的计数
  • 使用the HAVING仅保留那些与您在IN语句中放入的匹配GUID数量相等的联系人

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
Run Code Online (Sandbox Code Playgroud)

data.stackexchange上测试脚本