SQL Server脚本未返回全部未使用整数,求助排查原因
问题原因与解决方案
为什么原脚本没返回4、5、6这类空缺数字?
你的SQL脚本逻辑是只检查每个已存在plu的下一个数字是否未被使用:
- 现有plu=2,检查3是否存在,不存在就返回3
- 现有plu=10,检查11是否存在,不存在就返回11
但像4、5、6这些数字,它们不是任何已存在plu的「下一个数」(现有plu里没有3,脚本根本不会去检查3+1=4是否存在),自然不会被筛选出来。这种写法只能捕获紧邻现有值的单个空缺,无法找出连续范围里的中间空缺。
正确的查询方式
要找出所有未被使用的数字(包括连续空缺的中间值),可以用递归CTE生成从最小plu到最大plu之间的所有连续数字,再筛选出不在现有plu列表中的值:
WITH RECURSIVE plu_range AS ( -- 从现有plu的最小值开始生成序列 SELECT MIN(plu) AS num FROM tovary WHERE plu > 0 UNION ALL -- 递归生成连续数字,直到现有plu的最大值 SELECT num + 1 FROM plu_range WHERE num + 1 <= (SELECT MAX(plu) FROM tovary WHERE plu > 0) ) -- 筛选出未被使用的plu数字 SELECT num AS unused_plu FROM plu_range WHERE num NOT IN (SELECT plu FROM tovary WHERE plu > 0) ORDER BY num;
如果需要从数字1开始查找(而非现有plu的最小值),只需把递归起始的MIN(plu)改成1即可。
内容的提问来源于stack exchange,提问作者Taliga
相关产品推荐
相关产品推荐

