Вступить в клуб →
сложнаявопросSQL и проверка данных

Сверка миграции через NOT IN вернула ноль расхождений, хотя данные потерялись

После переноса клиентов в новую систему вы проверяете, все ли клиенты доехали:

SELECT id
FROM clients_old
WHERE id NOT IN (SELECT client_id FROM clients_new);

Запрос возвращает 0 строк, и вы докладываете, что миграция прошла без потерь. Через неделю поддержка находит клиентов, которых нет в новой системе. Известно, что в clients_new у части служебных записей поле client_id не заполнено (NULL).

Что произошло?

  • Подзапрос выполнился до завершения миграции, поэтому сравнение шло с неактуальным набором данных
  • NOT IN сравнивает значения по типам, а id в старой и новой системе имеют разные типы, из-за чего сравнение отбрасывается
  • NOT IN сравнивает только первые совпавшие значения подзапроса, поэтому проверка неполная
  • Из-за NULL в подзапросе условие NOT IN ни для одной строки не становится истинным, и запрос всегда возвращает пусто

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела