2

あるテーブルから別のテーブルにデータを挿入しようとしていますが、重複する行が挿入されないようにしたいと思います。私は現在次のクエリを持っています:

INSERT INTO Table1
(
    Table1Col1,
    Table1Col2,
    Table1Col3,
    Table1Col4,
    Table1Col5
)
SELECT
    Table2Col1,
    Table2Col2 = constant1,
    Table2Col3 = constant2,
    Table2Col4 = constant3,
    Table2Col5 = constant4
FROM Table2
WHERE
    Condition1 = constant5
AND
    Condition2 = constant6
AND
    Condition3 = constant7
AND
    Condition4 LIKE '%constant8%'

私が知らないのは、Table2からTable1に挿入しようとしている行がすでに存在している可能性があることです。この重複の可能性を防ぎ、挿入をスキップして、次の一意の行の挿入に進みます。

WHERE NOT EXISTS句とINTERSECTキーワードを使用できることはわかりましたが、Table2から選択したデータの一部と定数値のみを使用したいため、特定のクエリに適用する方法を完全には理解していませんでした。 Table1に挿入します。

編集:

TableCol2からTableCol5までの列は実際には結果セットに存在せず、返されるTable2Col1と一緒にこれらの列にデータを入力していることを追加する必要があります。

4

3 に答える 3

3

SQL Server 2008を使用しているため、マージステートメントを使用できます。

キーに基づいて行が存在するかどうかを簡単に確認できます

このようなもの:

merge TableMain  AS target
using TableA as source 
ON <join tables here>
WHEN MATCHED THEN <update>
WHEN NOT MATCHED BY TARGET <Insert>
WHEN NOT MATCHED BY SOURCE <delete>
于 2012-08-16T10:36:08.390 に答える
1

Intersect(SQL Serverの用語ではマイナス)は、行全体を比較するため、問題外です。not in/not exists/left join他の2つのオプションはとですmergeNot Inは単一列の主キー専用であるため、この場合は問題外です。In/Exists/Left joinSQL Serverでも同じパフォーマンスが得られるはずなので、existsを使用します。

INSERT INTO Table1
(
    Table1Col1,
    Table1Col2,
    Table1Col3,
    Table1Col4,
    Table1Col5
)
SELECT
    Table2Col1,
    Table2Col2 = constant1,
    Table2Col3 = constant2,
    Table2Col4 = constant3,
    Table2Col5 = constant4
FROM Table2
WHERE
    Condition1 = constant5
AND
    Condition2 = constant6
AND
    Condition3 = constant7
AND
    Condition4 LIKE '%constant8%'
AND NOT EXISTS
    (
       SELECT *
         FROM Table1 target
        WHERE target.Table1Col1 = Table2.Table2Col1
          AND target.Table1Col2 = Table2.Table2Col2
          AND target.Table1Col3 = Table2.Table2Col3
    )

マージは2つのテーブルを同期するために使用されます。からレコードを挿入、更新、削除する機能がありtarget tableます。

merge into table1 as target
using table2 as source
   on target.Table1Col1 = source.Table2Col1
  AND target.Table1Col2 = source.Table2Col2
  AND target.Table1Col3 = source.Table2Col3
when not matched by target then
  insert (Table1Col1,
          Table1Col2,
          Table1Col3,
          Table1Col4,
          Table1Col5)
  values (Table2Col1,
          Table2Col2,
          Table2Col3,
          Table2Col4,
          Table2Col5);

table2の列が転送中に計算されるnot exists()場合、table2の代わりに派生テーブルを使用する可能性があります。同じことがmerge例にも当てはまります。table2への参照の代わりにクエリを配置するだけです。

于 2012-08-16T13:31:02.057 に答える
1

データがテーブルにすでに存在するかどうかを確認しました。このために、重複挿入を回避するためにIf条件を使用する必要があります

于 2012-10-24T03:34:03.547 に答える