私は「OPENQUERY」を使用して MS SQL Server から MySQL データベースにレコードを挿入しようとしていますが、重複キー メッセージを無視しようとしています。そのため、クエリが重複に遭遇した場合はそれを無視して続行します。
重複を無視するにはどのようなアイデアがありますか?
私がやっていることは次のとおりです:
- 「OpenQuery」を使用してMySQLからレコードを取得し、MySQLの「A.record_id」を定義します。
- ここから、これらのレコードを「直接 ID ではなく特定の条件を使用して」MS SQL Server のレコードに結合すると、SQL Server で新しい関連する「B.new_id」レコード識別子が見つかります。
- 見つかった結果を 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 つの行が選択されます。