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