TSQL-排除与临时表匹配的行

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 SELECT查询的帮助

我有
[详细信息]
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)