Het idee is om te kijken waar de hiaten beginnen. Laat me aannemen dat u SQL Server 2012 gebruikt, en dat geldt ook voor de lag()
en lead()
functies. Het volgende krijgt de volgende id
:
select t.*, lead(id) over (order by id) as nextid
from t;
Als er een gat is, dan nextid <> id+1
. U kunt de hiaten nu karakteriseren met 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;
BEWERKEN:
Zonder de lead()
, zou ik hetzelfde doen met een gecorreleerde subquery:
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;
Uitgaande van de id
is een primaire sleutel op de tafel (of zelfs dat het alleen een index heeft), beide methoden zouden redelijke prestaties moeten hebben.