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

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

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

В моем примере у меня есть около 5 столбцов (дата, номер1, номер2, текст1, текст2), которые я хотел бы вставить из таблицы1 в таблицу2, но только если они не существуют. Обновление не требуется. (Поэтому о слиянии не может быть и речи)


person LinkeLoutje    schedule 16.12.2016    source источник
comment
Нам нужно знать структуру вашей таблицы (обеих таблиц), чтобы помочь вам. Также потребуются образцы данных и ваше определение дубликатов.   -  person Siyual    schedule 16.12.2016


Ответы (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;
person Radu Gheorghiu    schedule 16.12.2016

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

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

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 из несуществующего коррелированного подзапроса.

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

person xQbert    schedule 16.12.2016