TSQL-排除与临时表匹配的行
我需要有关SQL SELECT查询的帮助 我有TSQL-排除与临时表匹配的行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要有关SQL SELECT查询的帮助 我有[详细信息]sql下表。我想选择具有匹配组id且给定临时表中不存在的行 DetailID GroupID TemplateID DocumentID ------------------------------------------------------ 1 A 2 NULL 2 A NULL 33 3
[详细信息]
sql下表。我想选择具有匹配组id且给定临时表中不存在的行
DetailID GroupID TemplateID DocumentID
------------------------------------------------------
1 A 2 NULL
2 A NULL 33
3 A 10 NULL *
4 B NULL 33
5 B 4 NULL *
6 C 2 NULL
7 C 4 NULL *
8 C NULL 55 *
@tmpDetails—具有TemplateID和DocumentID的模板表
TemplateID DocumentID
---------------------------
2 NULL
NULL 33
我想从@tmpDetail表中选择A、B和C组中没有匹配TemplateID和DocumentID的行
因此select查询应该返回细节ID为3,5,7,8的行
下面的查询不返回任何内容
SELECT * from Details D
WHERE D.GroupID IN ('A','B','C') AND NOT EXISTS
(SELECT d2.DetailID FROM Details d2
JOIN @tmpDetails t ON d2.TemplateID IS NOT NULL
AND d2.TemplateID = t.TemplateID
OR d2.DocumentID IS NOT NULL AND d2.DocumentID = t.DocumentID)
无论JOIN中的条件是什么,它都应该是where条件,但我确信如何组合SQL您没有将嵌套查询与主表(
D
)连接起来
您可以取消连接并执行以下操作:
SELECT * FROM Details D
WHERE D.GroupID IN ('A','B','C') AND NOT EXISTS
(SELECT 1 FROM @tmpDetails t
WHERE (D.TemplateID IS NOT NULL AND D.TemplateID = t.TemplateID) OR
(D.DocumentID IS NOT NULL AND D.DocumentID = t.DocumentID))
您可以使用
notexists
和带有INTERSECT
的子查询来处理NULL
值:
SELECT * FROM Details D
WHERE D.GroupID IN ('A', 'B', 'C')
AND NOT EXISTS (SELECT TemplateID, DocumentID FROM @tmpDetails INTERSECT
SELECT D.TemplateID, D.DocumentID)
SELECT * FROM Details D
WHERE D.GroupID IN ('A', 'B', 'C')
AND NOT EXISTS (SELECT TemplateID, DocumentID FROM @tmpDetails INTERSECT
SELECT D.TemplateID, D.DocumentID)