寻找列中的gap.其实在inside sql server 2008中有专门的讨论。
create table test (id int primary key); go
insert into values (1),(2),(3),(4),(5),(6),(8),(9),(11),(12),(13),(14),(18),(19)
查找出结果为:
missingbefore missingafter
6 8
9 11
14 18
以下为sql:
第一种方法使用了一个辅助表temp(tid int primarykey).在里面插入了一定量的数据。
WITH CTE AS ( SELECT TID FROM temp WHERE TID<= (SELECT MAX(ID)FROM TEST) ) , CTE2 AS ( SELECT * FROM CTE WHERE TID NOT IN ( SELECT ID FROM TEST ) ), CTE3 AS ( SELECT ROW_NUMBER() OVER(ORDER BY T2.ID) AS ROWNO ,T2.ID FROM CTE2 T1 JOIN TEST T2 ON ( T1.TID=T2.ID-1 OR T1.TID=T2.ID+1) ) SELECT T.ID AS MISSINGAFTER, T1.ID AS MISSINGBEFORE FROM CTE3 T JOIN CTE3 T1 ON T.ROWNO=T1.ROWNO-1 WHERE T.ROWNO%2=1 and T1.ROWNO%2=0
WITH TT AS ( select ROW_NUMBER() over( order by cur.id asc) as rownumber, bef.id as bef_id, cur.id as cur_id, aft.id as aft_id from test cur left join test bef on cur.id=bef.id+1 left join test aft on cur.id=aft.id-1 ) SELECT bf.cur_id as missing_after, af.cur_id as missing_before FROM TT as bf join TT as af on bf.rownumber=af.rownumber-1 where af.cur_id-bf.cur_id>1;