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.