在sql查询中替换Not In子句

时间:2014-10-09 13:31:41

标签: sql sql-server

我有一个临时表#allocations 其中包含以下字段

DAllocationId   DAllocationName FundCode    DSplitTotal DDisabled   DistAlloc   AAllocationId AAllocationName   ASplitTotal ADisabled

我有另一个表TRAN_POST_PTN,它还包含这些列以及其他列。 所以对于asplit id和dsplit id,我们只有相同的列名,即"发布号码"在TRAN_POST_PTN。

我需要做的是在我的分配表中插入来自TRAN_POST_PTN的所有行

posting_number is not in (select DAllocationId from #allocations) 
and posting_number not in (select AAllocationId from #allocations)

我不想在这里使用Not。

有人可以建议我更好地编写此查询。 我尝试使用union编写它,但这不起作用。

1 个答案:

答案 0 :(得分:10)

NOT IN有几种替代方案。这是一个使用NOT EXISTS

SELECT fields
FROM TRAN_POST_PTN tpp
WHERE NOT EXISTS (
    SELECT 1
    FROM #allocations a 
    WHERE tpp.posting_number IN (a.DAllocationId, a.AAllocationId))

另一种常见的方法是使用LEFT JOIN进行NULL次检查,但我相信您会看到使用NOT EXISTS获得更好的效果。

SELECT fields
FROM TRAN_POST_PTN tpp
    LEFT JOIN #allocations a ON tpp.posting_number = a.DAllocationId 
         OR tpp.posting_number = a.AAllocationId
WHERE a.DAllocationId IS NULL