Die Idee ist, zu schauen, wo die Lücken beginnen. Lassen Sie mich davon ausgehen, dass Sie SQL Server 2012 verwenden und daher auch die lag()
und lead()
Funktionen. Folgendes erhält die nächste id
:
select t.*, lead(id) over (order by id) as nextid
from t;
Wenn es eine Lücke gibt, dann nextid <> id+1
. Nun können Sie die Lücken mit where
charakterisieren :
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;
BEARBEITEN:
Ohne lead()
, würde ich dasselbe mit einer korrelierten Unterabfrage machen:
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;
Angenommen die id
ein Primärschlüssel für die Tabelle ist (oder sogar nur einen Index hat), sollten beide Methoden eine angemessene Leistung haben.