SQL插入记录如果不存在

时间:2013-03-11 19:03:00

标签: sql sql-server-2008-r2 sql-insert

我要做的是将表与另一个临时表进行比较,如果记录尚未存在,请将其插入表中。我的问题是IF NOT EXIST似乎不正确。如果我将代码分开,我遇到的问题是:

返回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

4 个答案:

答案 0 :(得分: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)

尝试这些并查看它们是否有效。

答案 1 :(得分:2)

如果你的product_code定义了两个表中的记录,你就不需要存在和内连接。

所以我假设您正在使用临时表作为引用,并且仅在临时表中仅存在记录时将记录添加到表中

所以你的查询应该是

 insert into no_stock
 select * from #no_stock
 where product_code not in (select product_code from no_stock)

答案 2 :(得分:0)

而不是NOT EXISTS,尝试

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)

答案 3 :(得分: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)