Tanken er at se på, hvor hullerne starter. Lad mig antage, at du bruger SQL Server 2012, og det samme har lag()
og lead()
funktioner. Følgende får det næste id
:
select t.*, lead(id) over (order by id) as nextid
from t;
Hvis der er et hul, så nextid <> id+1
. Du kan nu karakterisere hullerne ved at bruge 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;
EDIT:
Uden lead()
, ville jeg gøre det samme med en korreleret underforespørgsel:
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;
Forudsat id
er en primær nøgle på bordet (eller endda at den bare har et indeks), bør begge metoder have en rimelig ydeevne.