我有一个数据表。
ItemCode
1000
1002
1003
1020
1060
我正在尝试编写一条SQL语句以获取此表中没有的最小数字(ItemCode),并且一旦在表中插入了先前的最小订单ID,它就应该能够获得下一个最小数字,但也要跳过数据库中已经存在的数字。每次运行查询时,我只想得到1个结果。
因此,根据上表,它应该得到
1001
作为第一个结果。将ItemCode = 1001
插入表后,它应该获得的下一个结果应该是1004
,因为表中已经存在1000
到1003
。根据我在网上看到的所有内容,我认为我必须使用While循环来执行此操作。这是我仍在处理的代码。
DECLARE @Count int
SET @Count= 0
WHILE Exists (Select ItemCode
from OITM
where itemCode like '10%'
AND convert(int,ItemCode) >= '1000'
and convert(int,ItemCode) <= '1060')
Begin
SET @COUNT = @COUNT + 1
select MIN(ItemCode) + @Count
from OITM
where itemCode like '10%'
AND convert(int,ItemCode) >= '1000'
and convert(int,ItemCode) <= '1060'
END
我觉得必须有一种更简单的方法来完成此任务。有没有办法让我说...
选择表X中不存在的1000到1060之间的最小数字
编辑:在我的情况下创建一个新表不是一个选项
最终编辑:谢谢大家!我知道了。这是我的最终查询,该查询恰好返回了我想要的。我知道我无缘无故地使它变得太复杂了!
With T0 as ( select convert(int,ItemCode) + row_number() over (order by convert(int,ItemCode)) as ItemCode
from OITM
where itemCode like '10%'
AND convert(int,ItemCode) >= '1000'
And convert(int,ItemCode) <= '1060')
Select MIN(convert(varchar,ItemCode)) as ItemCode
from T0
where convert(int,ItemCode) Not in (Select convert(int,ItemCode)
from OITM
where itemCode like '10%'
AND convert(int,ItemCode) >= '1000'
and convert(int,ItemCode) <= '1060');
最佳答案
这应该做的事情。在这里,您将生成行的序号,然后将每一行与下一行进行比较(通过连接条件完成),然后仅对差异不为1的那些行进行过滤,并按顺序排序,最后选择最上面的行。
;with c as(select id, row_number() over(order by id) rn)
select top 1 c1.id + 1 as NewID
from c as c1
join c as c2 on c1.rn + 1 = c2.rn
where c2.id - c1.id <> 1
order by c1.rn
关于sql - 选择范围内的最小数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29812780/