Cílem je podívat se, kde začínají mezery. Předpokládejme, že používáte SQL Server 2012 a máte také lag()
a lead()
funkcí. Následující dostane další id
:
select t.*, lead(id) over (order by id) as nextid
from t;
Pokud je mezera, pak nextid <> id+1
. Nyní můžete mezery charakterizovat pomocí 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:
Bez lead()
, udělal bych to samé s korelovaným poddotazem:
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;
Za předpokladu id
je primární klíč v tabulce (nebo dokonce že má jen index), obě metody by měly mít přiměřený výkon.