5

同じ構造のテーブルが2つあります。1つは一時的なもので、もう1つは製品的なものです。データセット全体が毎回読み込まれ、このデータセットによって以前のデータセットからレコードが削除される場合があります。最初にデータセットを一時テーブルにロードし、レコードが削除された場合は、それらをprodテーブルからも削除したいと思います。

では、prodには存在するが、tempには存在しないレコードをどのように見つけることができますか?外部結合を試しましたが、機能していないようです。左または右の外部結合の実行に応じて、左または右のテーブルからすべてのレコードを返します。

次に、prodテーブルのこれらのレコードも削除します。

4

3 に答える 3

26

1つの方法は、MINUS演算子を使用することです

SELECT * FROM table1
MINUS
SELECT * FROM table2

table1完全に一致しないすべての行が表示されtable2ます(特定のキーが両方のテーブルに存在するかどうかを判断する場合にのみ、より小さな列リストを指定できます)。

もう1つは、NOT EXISTS

SELECT *
  FROM table1 t1
 WHERE NOT EXISTS( SELECT 1
                     FROM table2 t2
                    WHERE t1.some_key = t2.some_key )
于 2012-11-29T17:25:18.097 に答える
3

次のようなものはどうですか?

SELECT * FROM ProdTable WHERE ID NOT IN
   (select ID from TempTable);

DELETEステートメントと同じように機能します。

DELETE FROM ProdTable WHERE ID NOT IN
   (select ID from TempTable);
于 2012-11-29T17:23:28.060 に答える
3

MINUSはここで機能します次のステートメントは、結果をMINUS演算子と組み合わせます。この演算子は、最初のクエリによって返された行のみを返し、2番目のクエリによって返された行は返しません。

SELECT * FROM prod
MINUS
SELECT * FROM temp;

マイナスは、テーブル構造が同じ場合にのみ機能します

于 2012-11-29T17:25:31.270 に答える