Удалите строки, для которых существует запись с тем же email и меньшим id. Для PostgreSQL можно использовать DELETE ... USING; перед реальным удалением сначала проверьте выбранные строки и резервную копию.
Очистка таблицы Person от повторяющихся email‑адресов
Удалите строки, для которых существует запись с тем же email и меньшим id. Для PostgreSQL можно использовать DELETE ... USING; перед реальным удалением сначала проверьте выбранные строки и резервную копию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо удалить все дубли email‑адресов из таблицы Person, оставив только запись с наименьшим значением id для каждого уникального адреса.
Input: +----+-------------------+ | id | email | +----+-------------------+ | 1 | john@example.com | | 2 | bob@example.com | | 3 | john@example.com | +----+-------------------+ Output: +----+-------------------+ | id | email | +----+-------------------+ | 1 | john@example.com | | 2 | bob@example.com | +----+-------------------+
Ответ
Удалите строки, для которых существует запись с тем же email и меньшим id. Для PostgreSQL можно использовать DELETE ... USING; перед реальным удалением сначала проверьте выбранные строки и резервную копию.
Вариант с явной обработкой NULL как одинаковых значений:
DELETE FROM Person AS duplicate
USING Person AS original
WHERE duplicate.email IS NOT DISTINCT FROM original.email
AND duplicate.id > original.id;
При уникальном id останется минимальный id каждой группы. Если NULL не должен считаться дубликатом, замените сравнение email на обычное равенство и уточните правила. Удаление может влиять на внешние ключи; сначала нужен план для связанных данных. Для предотвращения новых дублей добавляют подходящее уникальное ограничение.