sql >> Databáze >  >> RDS >> Sqlserver

Najděte všechny celočíselné mezery v SQL

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.



  1. Volání uložené procedury MySQL pomocí VB6 s parametrem OUT

  2. Jak mohu přidat sloupec, který se zvyšuje na jiný sloupec ve stejné tabulce?

  3. Kde hledá Rubyho metoda have_header soubory záhlaví?

  4. Chyba při načítání ze sekvence vracející tabulku z funkce Oracle v C#, kde funkce používá dblink na SQL Server