Sokan szeretnék, ha egy tábla id-jában nem lennének lyukak. Ezt nem egyszerű megoldani, a legtöbb esetben nem is kell. Viszont ha kíváncsiak vagyunk, hogy mennyi ilyen van, akkor itt egy lekérdezés, amivel ezt megnézhetjük.
;with cte as ( select id, id - row_number() over(order by id) as rn from <table name> ) select row_number() over(order by (select null)) as group_id, min(id) as min_id, max(id) as max_id from cte group by rn order by min_id
Demozzuk le
1.) Készítsünk egy táblát 100.000 sorral
drop table if exists #tmp go select top 100000 row_number() over(order by (select null)) as id into #tmp from sys.columns c1 cross join sys.columns c2 cross join sys.columns c3 cross join sys.columns c4 cross join sys.columns c5 go
2.) Töröljünk belőle, hogy tudjuk ellenőrizni a script-et
delete from #tmp where id between 1000 and 5000 or id between 10000 and 15000 or id between 25000 and 35000 go
3.) Ellenőrizzük le
;with cte as ( select id, id - row_number() over(order by id) as rn from #tmp ) select row_number() over(order by (select null)) as group_id, min(id) as min_id, max(id) as max_id from cte group by rn order by min_id
És az eredmény:
group_id min_id max_id -------------------- -------------------- -------------------- 1 1 999 2 5001 9999 3 15001 24999 4 35001 100000
Reklámok
Vélemény, hozzászólás?