แนวทางแก้ไขต่อไปนี้:
- ให้ข้อมูลการทดสอบ
- แบบสอบถามภายในที่สร้างช่องว่างอื่น ๆ และ
- ใช้งานได้ใน SQL Server 2012
ตัวเลขแถวที่เรียงลำดับตามลำดับในอนุประโยค " with " จากนั้นนำผลลัพธ์กลับมาใช้ซ้ำสองครั้งโดยมีการรวมภายในกับหมายเลขแถว แต่หักล้างด้วย 1 เพื่อเปรียบเทียบแถวก่อนหน้ากับแถวหลังโดยมองหา ID ที่มีช่องว่างมากกว่า 1. มากกว่าที่ขอ แต่ใช้ได้กว้างขวางกว่า
create table #ID ( id integer );
insert into #ID values (1),(2), (4),(5),(6),(7),(8), (12),(13),(14),(15);
with Source as (
select
row_number()over ( order by A.id ) as seq
,A.id as id
from #ID as A WITH(NOLOCK)
)
Select top 1 gap_start from (
Select
(J.id+1) as gap_start
,(K.id-1) as gap_end
from Source as J
inner join Source as K
on (J.seq+1) = K.seq
where (J.id - (K.id-1)) <> 0
) as G
แบบสอบถามภายในก่อให้เกิด:
gap_start gap_end
3 3
9 11
แบบสอบถามภายนอกก่อให้เกิด:
gap_start
3
LAG(id, 1, null)
ฟังก์ชันที่มีOVER (ORDER BY id)
อนุประโยคได้