У меня есть следующие две таблицы:Избегайте дубликатов в INSERT INTO SELECT, запрос в SQL Server
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
, основанных на некоторых условиях.
Ju Если вы хотите уточнить версию NOT EXISTS, вам понадобится подсказка WITH (HOLDLOCK) или никаких блокировок (потому что нет блокировок!), чтобы другой поток мог вставить строку под вас. – IDisposable
Интересно, потому что я всегда считал, что присоединение будет быстрее, чем подвыборы. Возможно, это только для прямого соединения и не применимо к левым объединениям. – Duncan
Дункан, соединение часто быстрее, чем подзапросы, когда они связаны с подзапросами. Если у вас есть подзапрос в списке выбора, соединение часто будет быстрее. – HLGEM