在sql查询中替换Not In子句

Viv*_*ekN -4 sql sql-server

我有一个临时表#allocations,它有以下字段

DAllocationId   DAllocationName FundCode    DSplitTotal DDisabled   DistAlloc   AAllocationId AAllocationName   ASplitTotal ADisabled
Run Code Online (Sandbox Code Playgroud)

我有另一个表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)
Run Code Online (Sandbox Code Playgroud)

我不想在这里使用Not.

有人可以建议我更好的方式来编写这个查询.我尝试使用union编写它,但这不起作用.

sge*_*des 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))
Run Code Online (Sandbox Code Playgroud)

另一种常见的方法是使用LEFT JOINNULL检查,但我相信你会看到一个更好的性能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
Run Code Online (Sandbox Code Playgroud)

  • @sgeddes难道你没有得到它,男人?,"IN"和"NOT IN"是魔鬼!网上有些老兄这么说,你怎么敢用他们的答案? (8认同)
  • @Lamak -- LMAO :D 但是,但是,魔鬼让我这样做了! (2认同)
  • 感谢您的建议人们,在得出任何结论之前,我应该对此进行更多的研究.感谢您的建议,而且我将确保不会打电话给IN而不是恶作剧,并且会在需要时使用它们 (2认同)