Как избежать дублирования в SQL INSERT INTO SELECT: методы и примеры кода

При работе с SQL часто встречаются ситуации, когда вам необходимо вставить данные из одной таблицы в другую с помощью оператора INSERT INTO SELECT. Однако возникает проблема, когда вы хотите избежать вставки повторяющихся записей в целевую таблицу. В этой статье блога мы рассмотрим несколько методов с примерами кода, позволяющих решить эту проблему и обеспечить целостность данных.

Метод 1: использование ключевого слова DISTINCT
Один простой подход – использовать ключевое слово DISTINCTв операторе SELECTдля устранения повторяющихся записей перед вставкой их в целевую таблицу.. Вот пример:

INSERT INTO destination_table (column1, column2, column3)
SELECT DISTINCT column1, column2, column3
FROM source_table

Метод 2: использование предложения NOT EXISTS.
Другой распространенный метод предотвращения дублирования — использование предложения NOT EXISTSдля проверки наличия записи в целевой таблице перед ее вставкой. Вот пример:

INSERT INTO destination_table (column1, column2, column3)
SELECT column1, column2, column3
FROM source_table
WHERE NOT EXISTS (
    SELECT 1
    FROM destination_table
    WHERE destination_table.column1 = source_table.column1
    AND destination_table.column2 = source_table.column2
    AND destination_table.column3 = source_table.column3
)

Метод 3: использование предложения LEFT JOIN
Предложение LEFT JOINтакже можно использовать для идентификации и исключения повторяющихся записей во время процесса вставки. Вот пример:

INSERT INTO destination_table (column1, column2, column3)
SELECT source_table.column1, source_table.column2, source_table.column3
FROM source_table
LEFT JOIN destination_table
    ON destination_table.column1 = source_table.column1
    AND destination_table.column2 = source_table.column2
    AND destination_table.column3 = source_table.column3
WHERE destination_table.column1 IS NULL

Метод 4: использование функции ROW_NUMBER().
В базах данных, поддерживающих оконные функции, вы можете использовать функцию ROW_NUMBER(), чтобы присвоить уникальный номер каждой строке, а затем отфильтровать дубликаты на основе это число. Вот пример:

INSERT INTO destination_table (column1, column2, column3)
SELECT column1, column2, column3
FROM (
    SELECT column1, column2, column3, ROW_NUMBER() OVER (PARTITION BY column1, column2, column3 ORDER BY column1) AS rn
    FROM source_table
) AS subquery
WHERE rn = 1

Реализуя любой из этих методов, вы можете избежать дублирования записей при использовании оператора INSERT INTO SELECTв SQL. Независимо от того, решите ли вы использовать ключевое слово DISTINCT, предложение NOT EXISTS, предложение LEFT JOINили функцию ROW_NUMBER(), крайне важно поддерживать целостность данных и предотвращать вставку избыточных данных в вашу базу данных.