Это решение должно дать вам первое и последнее значения идентификатора "дыр", которые вы ищете. Я использую это в Firebird 1.5 на таблице записей по 500 КБ, и хотя это занимает немного времени, это дает мне то, что я хочу.
SELECT l.id + 1 start_id, MIN(fr.id) - 1 stop_id
FROM (table l
LEFT JOIN table r
ON l.id = r.id - 1)
LEFT JOIN table fr
ON l.id < fr.id
WHERE r.id IS NULL AND fr.id IS NOT NULL
GROUP BY l.id, r.id
Например, если ваши данные выглядят так:
ID
1001
1002
1005
1006
1007
1009
1011
Вы получите это:
start_id stop_id
1003 1004
1008 1008
1010 1010
Хотелось бы получить полную оценку за это решение, но я нашел его по адресу Xaprb .