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条款时,这就会失败.错误消息是"查询处理器耗尽了内部资源,无法生成查询计划.这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询.请简化查询".
这个的要点是
IN语句中选择具有任何GUID的所有联系人DISTINCT COUNT来获取匹配GUID的每个contactid的计数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上测试脚本
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |