A ideia é olhar para onde as lacunas começam. Deixe-me supor que você está usando o SQL Server 2012 e, portanto, tem o
lag()
e lead()
funções. O seguinte obtém o próximo id
:select t.*, lead(id) over (order by id) as nextid
from t;
Se houver uma lacuna,
nextid <> id+1
. Agora você pode caracterizar as lacunas usando 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;
EDITAR:
Sem o
lead()
, eu faria a mesma coisa com uma subconsulta correlacionada: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;
Assumindo o
id
é uma chave primária na tabela (ou mesmo que tenha apenas um índice), ambos os métodos devem ter um desempenho razoável.