sql >> Database teknologi >  >> RDS >> Sqlserver

Find alle heltalshuller i SQL

Tanken er at se på, hvor hullerne starter. Lad mig antage, at du bruger SQL Server 2012, og det samme har lag() og lead() funktioner. Følgende får det næste id :

select t.*, lead(id) over (order by id) as nextid
from t;

Hvis der er et hul, så nextid <> id+1 . Du kan nu karakterisere hullerne ved at bruge 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:

Uden lead() , ville jeg gøre det samme med en korreleret underforespørgsel:

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;

Forudsat id er en primær nøgle på bordet (eller endda at den bare har et indeks), bør begge metoder have en rimelig ydeevne.



  1. MODIFY COLUMN i oracle - Hvordan kontrollerer man, om en kolonne er nullbar, før den indstilles til nullbar?

  2. Mysq- Connection hvordan man indstiller til at kunne indsætte arabisk tekst i databasen

  3. Er OraOLEDB-udbyder i .NET upålidelig på CLOB-felter?

  4. Skriv skæv anomali i Oracle, og PostgreSQL ruller ikke tilbage transaktion