1

まったく同じ形式のSQLテーブルが2つあり、1つは一時テーブルとして使用され、もう1つは静的テーブルとして使用されています。

現在、私のコードは静的テーブルをワイプし、一時テーブルからの新しいデータを毎回入力しますが、これは私が必要としているものではありません。2つのテーブルを比較するある種のSQL差分を作成しようとしています。これにより、一時テーブルにはないが静的テーブルにはあるレコードが削除され、一時テーブルにはあるが新しいレコードが追加されます。静的テーブルではありません。したがって、静的テーブルは、ワイプされて再書き込みされるのではなく、実行ごとにのみ更新されます。

したがって、一時テーブルにABC1、ABC2、ABC4があり、静的テーブルにABC1、ABC3、ABC4がある場合

私のSQLクエリは理想的にはABC1、ABC2、ABC4を返します

削除したい値と追加したい値を選択しているように見えるクエリが2つありますが、現在、削除したものを正しく機能させることができないため、クエリに不足しているものがあるかどうか疑問に思っています。

このクエリは、一時テーブルにはあるが静的テーブルにはないデータを挿入します。

 Insert into [static table] 
    SELECT * 
  FROM [temp table]

EXCEPT

SELECT *
  FROM [static table]

このクエリは、静的テーブルにはあるが一時テーブルにはないデータを削除する必要があります。

 delete from [static table] 
 where not exists 
    (SELECT *
  FROM [static table]

EXCEPT

SELECT *
  FROM [temp table] )

誰かが私のクエリの問題が何であるか、またはこのタスクを実行するためのより良い方法があるかどうかを提案できますか?ありがとう

4

3 に答える 3

2

SQL2008で導入されたMERGEを見てください。

たとえば、テストされていませんが、次のようなものです...

MERGE StaticTable AS target
USING TempTable AS source ON target.ColumnA = source.ColumnA
-- value doesn't exist in the target table, so add it
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ColumnA) VALUES (source.ColumnA)
-- value doesn't exist in the source table, so delete from target
WHEN NOT MATCHED BY SOURCE THEN 
    DELETE

編集:複数の列で作業するには、次のようになります。

 MERGE StaticTable AS target
    USING TempTable AS source ON target.ColumnA = source.ColumnA 
        AND target.ColumnB = source.ColumnB
    -- value doesn't exist in the target table, so add it
    WHEN NOT MATCHED BY TARGET THEN 
        INSERT (ColumnA, ColumnB) VALUES (source.ColumnA, source.ColumnB)
    -- value doesn't exist in the source table, so delete from target
    WHEN NOT MATCHED BY SOURCE THEN 
        DELETE
于 2013-02-25T10:26:24.790 に答える
1

「マージ」はあなたが望むことをするべきだと思います。詳細は次のとおりです。http: //msdn.microsoft.com/en-us/library/bb522522 (v = sql.105).aspx

于 2013-02-25T10:25:59.423 に答える
0

テーブルに一意のキーが定義されている場合は、おそらくIN構文を使用できます。

DELETE FROM static WHERE id NOT IN(SELECT id from temporary);
INSERT INTO static WHERE id IN(SELECT id from temporary) AND NOT id IN (SELECT id from static);
于 2013-02-25T10:30:51.867 に答える