Устранение дубликатов при вставке в SQL Server: методы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы не добавлять дубликаты, можно воспользоваться NOT EXISTS. Этот способ позволяет отсеивать строки, которые отсутствуют в целевой таблице:

SQL
Скопировать код
-- Проверим: дубликат или нет?
INSERT INTO target (cols)
SELECT src.cols FROM source src
WHERE NOT EXISTS (SELECT 1 FROM target WHERE target.id = src.id);

Также можно использовать EXCEPT, чтобы фильтровать повторяющиеся строки:

SQL
Скопировать код
-- Адью, дубликат!
INSERT INTO target (cols)
SELECT * FROM (SELECT cols FROM source EXCEPT SELECT cols FROM target) AS subq;
Кинга Идем в IT: пошаговый план для смены профессии

Объединение как для профессионалов

В SQL объединение таблиц напоминает сбор команды супергероев. С помощью MERGE можно гарантировать, что в составе "Мстителей" не окажется два Железных Человека:

SQL
Скопировать код
-- Когда из двух остается только один, и все это без дублирования!
MERGE target AS t
USING source AS s
ON t.id = s.id
WHEN NOT MATCHED BY TARGET THEN
    INSERT (cols) VALUES (s.cols);

Применение UNIQUE INDEX делает вашу базу данных похожей на эксклюзивный клуб, который не допускает дублирующие записи:

SQL
Скопировать код
-- ВИП-зона: дубликатам вход запрещен!
CREATE UNIQUE INDEX idx_target_id ON target(id);

Если вы не хотите тратить лишние ресурсы, можете сразу же отсеять дубликаты при выборке данных с использованием DISTINCT.

Визуализация

Визуализировать SQL-запросы можно сравнить с планированием большого мероприятия. Представим, что мы организуем концерт:

Список гостей (Таблица A): [🧑‍💼, 🧑‍🏫, 🧑‍🚀] Пришедшие гости (Таблица B): [👩‍🚒, 🧑‍🚀]

Выполнение запроса INSERT INTO SELECT без добавления дубликатов:

SQL
Скопировать код
INSERT INTO TableA (Guests)
SELECT DISTINCT NewGuests FROM TableB
WHERE NewGuests NOT IN (SELECT Guests FROM TableA);

В итоге дубликатов в списке не оказывается:

Обновленный список гостей (Таблица A): [🧑‍💼, 🧑‍🏫, 🧑‍🚀, 👩‍🚒]

🚪✋🧑‍🚀: Извините, астронавт, но дубли мы не принимаем! 🚪👉👩‍🚒: Пожарный, добро пожаловать на концерт!

Выбор оптимального подхода

Дуэль: Merge против DISTINCT

При выборе наиболее подходящего варианта учитывайте размеры таблиц и частоту операций DML. Несмотря на то, что оператор MERGE предоставляет больше гибкости, DISTINCT и NOT EXISTS могут быть более эффективными для решения простых задач.

Авангард: Индексы и ограничения

Индексы и ограничения – это ваша защита от нарушения PRIMARY KEYS и UNIQUE CONSTRAINTS. Индексы усиливают производительность запросов, но помните: большая власть влечет большую ответственность. Переиндексация может стать головной болью!

Устранение проблем: Обработка исключений

Будьте готовы к нестандартным ситуациям, с которыми может столкнуться SQL Server. Используйте блоки TRY-CATCH для выполнения запросов без риска получить ошибку:

SQL
Скопировать код
-- Если появляются проблемы, защититесь обработкой исключений!
BEGIN TRY
    -- Пытаемся вставить данные!
END TRY
BEGIN CATCH
    -- Ой, возникла ошибка
END CATCH

Стратегия: Тестирование и оптимизация

Следите и оценивайте ваши методы! Воспользуйтесь инструментами оптимизации запросов, такими как SQL Profiler или Query Store, чтобы оценить различные способы вставки данных и выбрать эффективный подход.

Полезные материалы

  1. "INSERT IGNORE" и "INSERT ... ON DUPLICATE KEY UPDATE" – Stack Overflow — Тактики борьбы с дубликатами
  2. MERGE (Transact-SQL) – Microsoft Learn — Оператор MERGE для управления дубликатами
  3. SQL Server: Ключевое слово DISTINCT — Подробнее о использовании DISTINCT
  4. Создание уникальных ограничений – Microsoft Learn — Правила для обеспечения уникальности данных
  5. Базовые принципы работы с индексами в SQL Server – Simple Talk — Руководство по работе с индексами
  6. Использование функции ROW_NUMBER() для построения пагинации в SQL Server — Оптимизация вставки данных с использованием ROW_NUMBER.