← Назад к вопросам

Как найти дубликаты в таблице

1.3 Junior🔥 292 комментариев
#Базы данных и SQL

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Поиск дубликатов в SQL-таблицах

Поиск дубликатов — одна из фундаментальных задач при работе с базами данных в контексте тестирования, особенно при проверке целостности данных, миграций или ETL-процессов. Как QA Engineer, я рассматриваю это не только с технической, но и с логической стороны: какие данные считать дублями? Часто дубликатом считается запись с одинаковыми значениями в ключевых полях (например, email, ID документа), но иногда нужно анализировать комбинации полей.

Основные методы поиска

1. Группировка с агрегацией (GROUP BY + HAVING)

Самый распространённый способ для поиска полных дубликатов по нескольким колонкам.

SELECT column1, column2, column3, COUNT(*) as duplicate_count
FROM table_name
GROUP BY column1, column2, column3
HAVING COUNT(*) > 1;

Для удобства можно получить ID дублирующихся записей:

SELECT *
FROM table_name t1
WHERE EXISTS (
    SELECT 1
    FROM table_name t2
    WHERE t1.column1 = t2.column1
      AND t1.column2 = t2.column2
      AND t1.id <> t2.id
);

2. Использование оконных функций (ROW_NUMBER())

Эффективный метод для пометки дубликатов и последующей работы с ними (например, удаления).

SELECT *,
       ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY id) as row_num
FROM table_name;
-- Затем отфильтровать WHERE row_num > 1

3. Self-Join

Наглядный, но менее производительный на больших таблицах способ.

SELECT t1.*, t2.*
FROM table_name t1
INNER JOIN table_name t2 
    ON t1.column1 = t2.column1
    AND t1.column2 = t2.column2
    AND t1.id < t2.id;

Практические аспекты для QA

  1. Определение критериев дубликата. Перед написанием запроса важно уточнить бизнес-логику: одинаковый username — это всегда дубликат? А если phone совпадает, но name разный?
  2. Производительность. На больших таблицах (миллионы строк) необходимо:
    • Использовать индексированные поля в WHERE и GROUP BY
    • Рассматривать оконные функции как наиболее оптимальные
    • Возможно, делать выборку по частям (пагинация)
  3. Контекст проверки:
    • Тестирование формы регистрации: ищем дубли по email/phone
    • Проверка импорта данных: дубли по ключевым бизнес-полям (order_number, contract_id)
    • Миграция данных: сравнение источника и приемника на наличие повторяющихся сущностей

Пример расширенного сценария

Часто нужно найти "мягкие" дубликаты — например, одни и те же данные с опечатками. Здесь помогут функции сравнения строк:

-- Поиск похожих имён (упрощённо)
SELECT a.id, a.customer_name, b.id, b.customer_name
FROM customers a
JOIN customers b 
    ON a.id < b.id
    AND SOUNDEX(a.customer_name) = SOUNDEX(b.customer_name)
WHERE a.customer_name <> b.customer_name;

Инструменты за пределами чистого SQL

В процессе тестирования я также использую:

  • Встроенные возможности IDE БД (например, DataGrip, DBeaver с их инструментами анализа)
  • Скрипты на Python/Pandas для сложных эвристик поиска дублей
  • Специализированные библиотеки (dedupe в Python для нечёткого поиска)

Резюме: Поиск дубликатов — не просто техническое упражнение, а важная проверка целостности данных. Эффективный QA Engineer должен понимать, какие SQL-запросы использовать в разных контекстах, как оптимизировать их для больших объёмов данных и как интерпретировать результаты с точки зрения бизнес-логики приложения. Всегда важно документировать такие проверки и включать их в регрессионное тестирование при изменении логики работы с данными.