2014-10-09 48 views
-4

不是取代在條款我有一個具有以下字段在SQL查詢

DAllocationId DAllocationName FundCode DSplitTotal DDisabled DistAlloc AAllocationId AAllocationName ASplitTotal ADisabled 

我有另一個表TRAN_POST_PTN其中也有這些列與其他列沿着臨時表#allocations 。 因此,對於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) 

我不想在這裏不使用插入到我分配表中的所有行。

有人可以建議我一個更好的方式來寫這個查詢。 我嘗試使用聯合編寫它,但沒有奏效。

+0

什麼是您的RDBMS? SQL Server?甲骨文? MySQL的? – mwigdahl 2014-10-09 13:34:30

+3

**爲什麼**你不想使用'不在'? – Lamak 2014-10-09 13:34:38

+0

它的SQL服務器,爲什麼我不想使用不在,原因是它是效率較低,因爲我在互聯網上讀取因爲每個發佈號碼,它會通過所有的分配行table.so n張貼數字在最壞的情況下,他們將N * N檢查done.Correct我,如果我錯了 – VivekN 2014-10-09 13:37:18

回答

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 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 
+0

再好一些在你的查詢中你再次使用IN操作。我不想要IN或NOT OPERATION。 – VivekN 2014-10-09 13:41:58

+1

@ user3408151 - 我不知道你在說什麼。在這種情況下使用IN將'DAllocationId'和'AAllocationId'分組在一起。它只是充當'OR' ...你的查詢的問題不是使用'NOT IN',而是你必須做兩次! – sgeddes 2014-10-09 13:43:20

+8

@sgeddes你不明白嗎,男人?,'IN''和'NOT IN'是魔鬼!,互聯網上的一些傢伙這麼說,你怎麼敢用你的答案呢? – Lamak 2014-10-09 13:45:50