Поиск пропусков в таблице
У нас тут сегодня на работе возникла гипотетическая потребность найти пропуски в конкретной таблице базы данных. Так как я кроме как с MySQL в последнее время ни с чем не имел, прикинул как бы я решил эту задачу там. Получилось что-то такое:
SELECT id FROM (
SELECT id, id-@prev AS diff, @prev:=id
FROM
(SELECT @prev:=NULL) ``,
sourceofdata
ORDER BY id
) `` WHERE diff>1
Внутри есть напрасный запрос «SELECT @prev:=NULL», который там только затем, чтобы решение получилось в одну строку.
В общем-то, у меня вопрос. Это не очень изящно и сверху есть запрос, который перебирает всю таблицу, не знаю что там делает с ним оптимизатор, сгружает ли данные во временную или фильтрует поверх. Если рассматривать худший случай, стоимость такого запроса может быть немаленькой.
Может кто-то придумать проще? Не важно для какой СУБД.
В Oracle как-то так:
Для других баз можно как-то так:
Комментарий для HiltoN:
Прочитал про LAG, спасибо! Не работал с аналитическими функциями, буду знать!
Комментарий для HiltoN:
Тут умножение же таблиц, не сказал бы что так лучше.
Комментарий для Евгения Степанищева:
Без привязки к конкретной СУБД нельзя сказать, что будет быстрее. Для MySQL скорее ваш первый вариант предпочтительнее, а Oracle вполне себе соптимизирует мой вариант (но аналитические функции всё равно быстрее будут).
А что значит «пропуски в таблице»? Это когда id записей должны идти подряд, но есть места, где пропущены номера?
Например 1, 2, 3, 4, 6, 7 -- пропущено 5?
Комментарий для efix.livejournal.com:
Да.
в лоб:
select t1.id+1 from table_name t1 left join table_name t2 on t2.id=t1.id+1 where t2.id is null
Комментарий для masterspammer.livejournal.com:
Это первый вариант, который мне в голову пришёл :) Но тут умножение таблицы на саму себя, вот что плохо.