2013-03-11 133 views
6

我想要做的是將表與另一個臨時表進行比較,如果該記錄不存在,則將其插入表中。我的問題是IF NOT EXIST似乎不正確。如果我拉的代碼分開我的問題是:SQL插入記錄如果不存在

返回29個結果:

SELECT * 
from NO_STOCK INNER JOIN #no_stock 
    ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE 
WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE. 

這將返回任何結果(我希望它可以返回34):

SELECT PRODUCT_CODE 
FROM #no_stock 
WHERE NOT EXISTS 
    (SELECT * from NO_STOCK INNER JOIN #no_stock 
    ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE 
    WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 

這將返回63:

SELECT PRODUCT_CODE 
FROM #no_stock 
WHERE EXISTS 
    (SELECT * from NO_STOCK INNER JOIN #no_stock 
    ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE 
    WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 

ps。使用SQL Server 2008 R2

回答

6

在你的子查詢中刪除你的內部連接。

什麼,你應該嘗試如下:

SELECT PRODUCT_CODE FROM #no_stock 
WHERE NOT EXISTS (SELECT * from NO_STOCK 
       WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 

你不需要內,因爲#no_stock表在外部查詢引用在這裏加入。

這同樣適用於你的其他查詢真:

SELECT PRODUCT_CODE FROM #no_stock 
WHERE EXISTS (SELECT * from NO_STOCK 
      WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 

嘗試這些,看看他們的工作。

0

反而不是存在,嘗試

WHERE Product_Code NOT IN (SELECT Product_Code FROM NO_STOCK INNER JOIN #no_stock ON NO_STOCK.PRODUCT_CODE #no_stock.PRODUCT_CODE WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 
+0

爲什麼這個工作比NOT EXISTS更好? – 2013-03-11 19:16:30

+0

謝謝,已經幫了很多!不能在我想檢查日期的情況下使用嗎?那麼只有在產品代碼和日期不存在於同一記錄中的當前日期的情況下才能插入? – user2158168 2013-03-11 19:20:34

+0

否,NOT IN將一個項目的值與返回一列的SELECT語句的結果進行比較。如果你需要檢查多個值的存在,你最好回到NOT EXISTS – Melanie 2013-03-12 13:55:42

0

試試這個...

SELECT PRODUCT_CODE FROM #no_stock 
WHERE NOT EXISTS (SELECT * from NO_STOCK INNER JOIN #no_stock 
        ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE) 
2

你不需要都存在,並且內部連接的情況下,你的產品代碼定義中均有記載表。

,所以我想你正在使用臨時表作爲參考,從臨時表只有在情況下,它只能在臨時表中存在增加記錄表

所以您的查詢應該是這樣

insert into no_stock 
select * from #no_stock 
where product_code not in (select product_code from no_stock) 
相關問題