L'idée est de regarder où commencent les lacunes. Laissez-moi supposer que vous utilisez SQL Server 2012, et que vous avez donc le lag()
et lead()
les fonctions. Ce qui suit obtient le prochain id
:
select t.*, lead(id) over (order by id) as nextid
from t;
S'il y a un espace, alors nextid <> id+1
. Vous pouvez maintenant caractériser les écarts en utilisant 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;
MODIFIER :
Sans le lead()
, je ferais la même chose avec une sous-requête corrélée :
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;
En supposant que l'id
est une clé primaire sur la table (ou même qu'elle a juste un index), les deux méthodes devraient avoir des performances raisonnables.