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

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

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

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

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

Проблема заключается в том, что при соединении таблицы A с таблицей B иногда я нахожу более 2 записей в таблице B, которые соответствуют критериям, которые я ищу, что приводит к тому, что значение A.record_id увеличивается до 2+ в моем наборе данных, прежде чем вставить его в таблицу A что вызывает проблему. Обратите внимание, я могу использовать функцию агрегирования для устранения записей.

2 ответа

Я не думаю, что есть конкретный вариант. Но это достаточно просто сделать:

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

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