Sql выбрать каждую

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

Приходят пользователи и просят: «Вот мы внесли данные в базу, а скажите нам, чего не хватает? Какие данные мы ещё не внесли в базу и их не хватает для полного счастья?» Первая (и скажем честно, весьма глупая) реакция: «Как же я вам найду то, чего нет в базе данных?».

Но отбросим эмоции и применим логику. Ведь, как правило, требуются данные, формирование которых подчиняется некоему правилу — номера квитанций, справок и так далее… И я исхожу из того, что все эти номера и идентификаторы могут быть преобразованы в натуральную последовательность. То есть задача будет сформулирована следующим образом: в базе данных хранится последовательность натуральных чисел, в которой есть пропуски, и необходимо вывести пропущенные числа для пользователя. В такой формулировке задача уже выглядит достаточно простой. Более того — возникает желание реализовать эту задачу одним единственным sql-запросом.

Давайте создадим таблицу и заполним какими-нибудь данными.

Основная идея следующая: сравнить таблицу с самой собой же и для каждого значения ИКС найти минимальное ИГРЕК (которое всё же больше ИКСа), где (ИКС + 1) и (ИГРЕК — 1) будут нашими границами пропущенных диапазонов чисел. Добавив логичное условие, что, (ИКС + 1) должен быть не меньше (ИГРЕК — 1) получим следующие диапазоны: от 4 до 4, от 6 до 6, от 10 до 10 и от 13 до 15. Какие есть нюансы: 1) Может быть пропущен первый элемент последовательности (в нашем случае это 1) 2) Неизвестен последний элемент последовательности (а вдруг это 22). Можно, конечно, запрашивать эту информацию у пользователя, но опыт подсказывает, что лучше этого избегать. 3) Диапазон «от 4 до 4» выглядит глючно, надо заменить просто на одно число 4) Результат всё-таки желательно получить значением одной строки, а не набором строк

Учитываем замечания и получаем вариант скрипта под MySQL:

и вариант под Oracle:

Результатом их выполнения является строка ’1-2, 4, 6, 10, 13-15, 18…’ Во-первых, эта строка содержит то, что хотели пользователи. Во-вторых, результат выглядит понятно для любого пользователя. И в-главных, запрос выводит данные, которые действительно в базе данных не хранятся!

UPD1:

Источник

Поделиться:
Нет комментариев

Добавить комментарий

Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.

×
Вам будет интересно