Совершенно другой способ сделать это:
SELECT a.intId, b.intId
FROM MyTable a
CROSS JOIN MyTable b
WHERE a.intId + 1 < b.intId
AND NOT EXISTS (
SELECT NULL FROM MyTable c
WHERE c.intId > a.intId
AND c.intId < b.intId
)
, который даст пары идентификаторов, между которыми были удалены все записи.
Так что, если идентификаторы были (1, 2, 3, 6, 7, 12), он будет возвращать (3, 6) и (7, 12).
РЕДАКТИРОВАТЬ:
Это очень неэффективно, если таблица большая,Следующий метод намного лучше:
SELECT g.intStartId, MIN(t.intId) AS intEndId
FROM (
SELECT intId AS intStartId
FROM MyTable AS a
WHERE NOT EXISTS (
SELECT NULL FROM MyTable AS b
WHERE b.intId = a.intId + 1
)
) AS g
CROSS JOIN MyTable AS t
WHERE t.intId > g.intStartId
GROUP BY g.intStartId
Итак, сначала мы находим идентификаторы, которые отмечают начало пропуска, а затем мы находим самый низкий идентификатор, который у нас больше, чем каждый, чтобы обозначить конец пропуска.