6

私がやろうとしているのは、テーブルを別の一時テーブルと比較し、レコードがまだ存在しない場合はテーブルに挿入することです。私の問題は、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

4 に答える 4

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)

これらを試して、機能するかどうかを確認してください。

于 2013-03-11T19:12:32.310 に答える
2

product_codeが両方のテーブルのレコードを定義する場合は、existsと内部結合の両方は必要ありません。

したがって、一時テーブルを参照として使用し、一時テーブルにのみ存在する場合にのみ、一時テーブルからテーブルにレコードを追加していると思います。

したがって、クエリは次のようになります。

 insert into no_stock
 select * from #no_stock
 where product_code not in (select product_code from no_stock)
于 2013-03-11T19:11:29.407 に答える
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) 
于 2013-03-11T19:10:34.910 に答える
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)
于 2013-03-11T19:09:49.827 に答える