Избегайте дубликатов в Запросе Select INSERT INTO в 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 операторы на основе некоторого условия.

97
задан Pang 22 November 2017 в 03:25
поделиться

2 ответа

Использование НЕ СУЩЕСТВУЕТ :

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 менее эффективен. См. эту ссылку для получения более подробной информации .

185
ответ дан 24 November 2019 в 05:23
поделиться

В MySQL можно сделать так:

INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1

Есть ли что-то подобное в SQL Server?

33
ответ дан 24 November 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: