以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  求救如何用sql找出一段连续的流水号之间缺失的号码  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=140009)

--  作者:chen37280600
--  发布时间:2019/8/27 15:37:00
--  求救如何用sql找出一段连续的流水号之间缺失的号码
一段连续的流水号,比如1~10,查询中间缺失的号码,比如,4、7、8、9。
或者更复杂一点,查询每个ID下的缺失流水号,比如ID为1,从1~10中间缺失的流水号,ID为2,从5~13的流水号。


此主题相关图片如下:1.png
按此在新窗口浏览图片


百度只找到Oracle的解决方法,我是mssql,不知道怎么解决,求版主搭救,给一段sql代码
[此贴子已经被作者于2019/8/27 15:37:39编辑过]

--  作者:有点蓝
--  发布时间:2019/8/27 17:33:00
--  
只能处理2048以内的流水号

with cte as
(
    select ID,流水号
    from 表A
),
CTE1 AS 
(
select distinct number,a.id from master..spt_values as m cross join cte as a
where type=\'p\' and number<(select MAX(b.流水号) from cte as b where b.id = a.id) 
and number>=(select MIN(k.流水号) from cte as k where k.id = a.id)
)

SELECT c.id,number+1 AS 流水号  FROM CTE1 as c LEFT JOIN CTE as d
ON c.number=d.流水号-1 and c.id=d.id
WHERE d.流水号 IS NULL
order by c.id,流水号

如果要处理大于2048的流水号,需要自己创建一个完整的流水号表做辅助
[此贴子已经被作者于2019/8/27 17:33:00编辑过]

--  作者:chen37280600
--  发布时间:2019/8/28 8:30:00
--  
妥!解决了,谢谢!
--  作者:xndd
--  发布时间:2019/8/28 8:38:00
--  
 另外有2个方法可以参考:
1 用excel,建一个数字列,从1拖动到x,x为sql查询出来的行数
2 把sql查询出来的列放入第二个列,然后条件比对,颜色标识

适合不懂程序编码的人使用

第二个方法,从系统获取需要判断的列,用程序循环比对