Что такое эквивалент "INSERT IGNORE" в MS SQL Server?

Я пытаюсь вставить записи в базу данных MySQL с MS SQL Server с помощью "OPENQUERY", но то, что я пытаюсь сделать, это игнорировать сообщения с дублирующимися ключами. поэтому, когда запрос запускается в дубликат, тогда игнорируйте его и продолжайте.

Какие идеи я могу сделать, чтобы игнорировать дубликаты?

Вот что я делаю:

  • вытягивание записей из MySQL с помощью "OpenQuery" для определения MySQL "A.record_id"
  • Присоединение этих записей к записям в MS SQL Server "с конкретными критериями, а не прямым идентификатором" здесь я нахожу новый связанный идентификатор записи B.new_id в SQL Server.
  • Я хочу вставить найденные результаты в новую таблицу в MySQL, например, A.record_id, B.new_id. Здесь, в новой таблице, я установил A.record_id как первичный ключ для этой таблицы.

Проблема заключается в том, что при объединении таблицы A с таблицей B несколько раз я нахожу 2+ записи в таблице B, соответствующие критериям, которые я ищу, что приводит к тому, что значение 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.

EDIT:

Для исправленной проблемы:

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 говорится, что вы не заботитесь о заказе. Точно одна строка с каждым идентификатором будет иметь значение 1. Дублирующие строки будут иметь значение больше единицы. seqnum = 1 выбирает ровно одну строку на один идентификатор.

Ответ 2

Если вы используете 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)