2 つのテーブルを結合する際に OPENQUERY を使用してデータを抽出するときに重複キーを無視するにはどうすればよいですか? 質問する

2 つのテーブルを結合する際に OPENQUERY を使用してデータを抽出するときに重複キーを無視するにはどうすればよいですか? 質問する

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

重複を無視するにはどのようなアイデアがありますか?

私がやっていることは次のとおりです:

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

問題は、テーブル A をテーブル B に結合するときに、探している条件に一致するレコードがテーブル B に 2 件以上あることが時々あることです。これにより、データ セット内で値 A.record_id が 2 回以上発生し、その後テーブル A に挿入されるため、問題が発生します。集計関数を使用してレコードを削除できることに留意してください。

ベストアンサー1

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

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 より大きい値になります。IDseqnum = 1ごとに 1 つの行が選択されます。

おすすめ記事