У меня есть следующие две таблицы:
Table1
----------
ID Name
1 A
2 B
3 C
Table2
----------
ID Name
1 Z
Я должен вставить данные из Table1
кому: Table2
. Я могу использовать следующий синтаксис:
INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1
Однако в моем случае, дублирующиеся идентификаторы могли бы существовать в Table2
(в моем случае это просто"1
") и я не хочу копировать это снова, поскольку это бросило бы ошибку.
Я могу записать что-то вроде этого:
IF NOT EXISTS(SELECT 1 FROM Table2 WHERE Id=1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
ELSE
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 WHERE Table1.Id<>1
Есть ли лучший способ сделать это без использования IF - ELSE
? Я хочу избежать два INSERT INTO-SELECT
операторы на основе некоторого условия.
Использование НЕ СУЩЕСТВУЕТ
:
INSERT INTO TABLE_2
(id, name)
SELECT t1.id,
t1.name
FROM TABLE_1 t1
WHERE NOT EXISTS(SELECT id
FROM TABLE_2 t2
WHERE t2.id = t1.id)
Использование НЕ В
:
INSERT INTO TABLE_2
(id, name)
SELECT t1.id,
t1.name
FROM TABLE_1 t1
WHERE t1.id NOT IN (SELECT id
FROM TABLE_2)
Использование LEFT JOIN / IS NULL
:
INSERT INTO TABLE_2
(id, name)
SELECT t1.id,
t1.name
FROM TABLE_1 t1
LEFT JOIN TABLE_2 t2 ON t2.id = t1.id
WHERE t2.id IS NULL
Из трех вариантов вариант LEFT JOIN / IS NULL
менее эффективен. См. эту ссылку для получения более подробной информации .
В MySQL можно сделать так:
INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1
Есть ли что-то подобное в SQL Server?