2016-12-16 7 views
2

私は、行が既に存在する場合、挿入しないようにするためのソリューションを探していました。私はいくつかの点で異なっている多くの答えを読んだことがあります。SQLは重複を挿入しません

たとえば、次のポストは、最上位の結果である: SQL Server Insert if not exist しかし、変数が使用されている理由を私は理解できないとどのように私はTABLE1とtable2のを定義します。誰かがこれを私の状況に適用できるようにさらに説明することができますか?

私の例では、私がtable1からtable2に挿入したい約5列(Date、Number1、Number2、Text1、Text2)を持っていますが、存在しない場合に限ります。更新は必要ありません。 (したがって、マージは問題ありません)

+3

私たちはあなたを知っている必要がありますあなたを助けるテーブル構造(両方のテーブルの)。サンプルデータと "重複"の定義も必要になります。 – Siyual

答えて

1

相関サブクエリを使用すると動作しません。

sub selectは、挿入するすべてのフィールドを結合してTable2に存在しないTable1のすべてのレコードを識別します。これにより、table2にはまだ存在しないレコードのみが挿入されます。

INSERT INTO table2 (Date, Number1, Number2, Text1, Text2) 
VALUES 
    (SELECT A.Date, A.Number1, A.Number2, A.Text1, A.Text2 
     FROM Table1 A 
     WHERE NOT EXISTS (SELECT 1 
         FROM Table2 B 
         WHERE A.Date = B.Date 
          AND A.Number1 = B.Number1 
          AND A.Number2 = B.Number2 
          AND A.Text1 = B.Text1 
          AND A.Text2 = B.Text2)) 

我々はそれがサブクエリから使い捨てだとして選択されているどのような値を気にしないので、私は単に相関サブクエリを存在しませから1を選択します。

ここで考慮する必要がある列がある場合は、それらをクエリに追加する必要があります。または、すべての列ではなく主キーが考えられる場合は、その列に結合するだけです。

1

NOT EXISTSを使用する代わりに、Table1Table2の両方から選択された2つの結果セット内のデータとの「違い」を行うためにEXCEPTキーワードを使用することです:

INSERT INTO table2 (Date, Number1, Number2, Text1, Text2) values 
SELECT A.Date, A.Number1, A.Number2, A.Text1, A.Text2 
FROM Table1 A 
EXCEPT 
SELECT B.Date, B.Number1, B.Number2, B.Text1, B.Text2 
FROM Table2 B; 
関連する問題