Идеята е да се погледне откъде започват пропуските. Нека приемя, че използвате SQL Server 2012, както и lag()
и lead()
функции. Следното получава следващия id
:
select t.*, lead(id) over (order by id) as nextid
from t;
Ако има пропуск, тогава nextid <> id+1
. Вече можете да охарактеризирате пропуските с помощта на where
:
select id+1 as FirstMissingId, nextid - 1 as LastMissingId
from (select t.*, lead(id) over (order by id) as nextid
from t
) t
where nextid <> id+1;
РЕДАКТИРАНЕ:
Без lead()
, бих направил същото със свързана подзаявка:
select id+1 as FirstMissingId, nextid - 1 as LastMissingId
from (select t.*,
(select top 1 id
from t t2
where t2.id > t.id
order by t2.id
) as nextid
from t
) t
where nextid <> id+1;
Приемане на id
е първичен ключ в таблицата (или дори че има само индекс), и двата метода трябва да имат разумна производителност.