SQL не вставляет дубликаты

Я искал решение для лучшей реализации не вставлять, если линия уже существует. Я прочитал много ответов, которые несколько отличаются друг от друга, и это немного выше моего уровня, чтобы иметь какой-либо смысл.

Например, следующий пост является лучшим результатом: SQL Server Вставьте, если не существует, но я не могу понять, почему используются переменные и как я определяю table1 и table2. Может ли кто-нибудь объяснить это немного дальше, чтобы я мог применить это к моей ситуации?

В моем примере у меня есть около 5 столбцов (Date, Number1, Number2, Text1, Text2), которые я хотел бы вставить из table1 в table2, но только если их не существует. Обновление не требуется. (Поэтому слияние не может быть и речи)

2 ответа

Альтернатива использованию NOT EXISTS, будет использовать EXCEPT ключевое слово для "разницы" между данными в двух результирующих наборах, выбранных из обоих Table1 а также Table2:

INSERT INTO table2 (Date, Number1, Number2, Text1, Text2) values 
SELECT A.Date, A.Number1, A.Number2, A.Text1, A.Text2 
FROM Table1 A
EXCEPT
SELECT B.Date, B.Number1, B.Number2, B.Text1, B.Text2 
FROM Table2 B;

Не существует должно работать с использованием коррелированного подзапроса.

Подвыбор идентифицирует все записи в Таблице 1, которые не существуют в Таблице 2, путем объединения всех полей, которые мы будем вставлять. Это гарантирует, что мы вставим только те записи, которые еще не существуют в table2.

INSERT INTO table2 (Date, Number1, Number2, Text1, Text2) 
VALUES 
     (SELECT A.Date, A.Number1, A.Number2, A.Text1, A.Text2 
      FROM Table1 A
      WHERE NOT EXISTS (SELECT 1 
                        FROM Table2 B
                        WHERE A.Date = B.Date
                          AND A.Number1 = B.Number1
                          AND A.Number2 = B.Number2
                          AND A.Text1 = B.Text1
                          AND A.Text2 = B.Text2))

Поскольку нам не важно, какое значение выбрано, поскольку оно выбрасывается из подзапроса, я просто выбираю 1 из несуществующего коррелированного подзапроса.

Теперь, если есть другие столбцы, которые мы должны рассмотреть, мы должны были бы добавить их в наш запрос, или если бы существовал первичный ключ вместо всех столбцов, то нам нужно было бы только присоединиться к нему.

Другие вопросы по тегам