Tanken är att titta på var klyftorna börjar. Låt mig anta att du använder SQL Server 2012, och så har du lag()
och lead()
funktioner. Följande får nästa id
:
select t.*, lead(id) over (order by id) as nextid
from t;
Om det finns ett gap, då nextid <> id+1
. Du kan nu karakterisera luckorna med 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:
Utan lead()
, jag skulle göra samma sak med en korrelerad underfråga:
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;
Förutsatt id
är en primärnyckel på bordet (eller till och med att den bara har ett index), bör båda metoderna ha rimlig prestanda.