Страницы

Поиск по вопросам

четверг, 15 ноября 2018 г.

SQL команда выборки [дубликат]

На данный вопрос уже ответили: Как выбрать пропущеные ID? 7 ответов Представим, что есть некая таблица Users, в которой есть идентификатор (primary key) с именем id. Но по какой-то причине id были вырваны строки. И получилась такая вот таблица:
id 1,2,3,5,6,7,8,10,12
Вопрос, как получить с использованием только одного select набор, который включает только остутствующие числа. То есть какой сделать sql запрос ?
Задали вопрос на собеседовании, стало очень интересно.


Ответ

Если это не диапозон (как в вашем случае), то задача решается очень тривиально и просто. Достаточно сделать подзапрос в WHERE, где нет следующего значения:
SELECT (`numbers`.`number`+1) AS `not_exists_number` FROM `numbers` WHERE (SELECT 1 FROM `numbers` AS `add_table` WHERE `add_table`.`number` = (`numbers`.`number` + 1)) IS NULL ORDER BY `numbers`.`number`;
Если действительно нужен один SELECT, то данное решение перепишем на JOIN
SELECT l.number + 1 AS missing FROM numbers AS l LEFT JOIN numbers AS r ON l.number + 1 = r.number WHERE r.number IS NULL;
Правда тут проблема в двух решениях, что последнее значение будет всегда больше последнего в таблице на 1, но его можно отсечь. Если у Вас было последнее 26, то он еще 27 выведет, но за-то очень просто :)

Комментариев нет:

Отправить комментарий