Что такое эквивалент 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 что вызывает проблему. Обратите внимание, я могу использовать функцию агрегирования для устранения записей.
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)