21

「OPENQUERY」を使用して MS SQL Server から MySQL データベースにレコードを挿入しようとしていますが、重複キー メッセージを無視しようとしています。そのため、クエリが重複して実行された場合は、それを無視して続行します。

重複を無視するにはどうすればよいですか?

これが私がやっていることです:

  1. 「OpenQuery」を使用してMySQLからレコードをプルし、MySQL「A.record_id」を定義します
  2. ここから、これらのレコードを MS SQL Server のレコードに「直接 ID ではなく特定の基準で」結合すると、SQL Server で新しい関連する「B.new_id」レコード識別子が見つかります。
  3. A.record_id、B.new_idのように、見つかった結果をMySQLの新しいテーブルに挿入したい ここでは、新しいテーブルで A.record_id をそのテーブルの主キーとして設定しています。

問題は、テーブル A をテーブル B に結合するときに、探している基準に一致するテーブル B に 2 つ以上のレコードが見つかることがあり、テーブル A に挿入する前に、値 A.record_id がデータセットで 2 回以上になることです。これが問題の原因です。集計関数を使用してレコードを削除できることに注意してください。

4

2 に答える 2

15

特定のオプションはないと思います。しかし、それを行うのは簡単です:

insert into oldtable(. . .)
    select . . .
    from newtable
    where not exists (select 1 from oldtable where oldtable.id = newtable.id)

一意のキーのセットが複数ある場合は、not existsステートメントを追加できます。

編集:

修正された問題の場合:

insert into oldtable(. . .)
    select . . .
    from (select nt.*, row_number() over (partition by id order by (select null)) as seqnum
          from newtable nt
         ) nt
    where seqnum = 1 and
          not exists (select 1 from oldtable where oldtable.id = nt.id);

このrow_number()関数は、行グループ内の各行に連続番号を割り当てます。グループは、partition byステートメントによって定義されます。数字は 1 から始まり、そこから増加します。このorder by句は、順序は気にしないことを示しています。各 ID を持つ 1 つの行だけが値 1 になります。重複する行は 1 より大きい値になります。は、seqnum = 1ID ごとに正確に 1 つの行を選択します。

于 2014-01-19T18:28:33.967 に答える
14

SQL Server 2008 以降を使用MERGEしている場合はINSERT、行が存在しない場合、またはUPDATE.

例:

MERGE
INTO    dataValue dv
USING   tmp_holding_DataValue t
ON      t.dateStamp = dv.dateStamp
        AND t.itemId = dv.itemId
WHEN NOT MATCHED THEN
INSERT  (dateStamp, itemId, value)
VALUES  (dateStamp, itemId, value)
于 2014-01-19T18:33:01.113 に答える