Что такое эквивалент "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)