我有一个数据表。

ItemCode
1000
1002
1003
1020
1060


我正在尝试编写一条SQL语句以获取此表中没有的最小数字(ItemCode),并且一旦在表中插入了先前的最小订单ID,它就应该能够获得下一个最小数字,但也要跳过数据库中已经存在的数字。每次运行查询时,我只想得到1个结果。

因此,根据上表,它应该得到1001作为第一个结果。将ItemCode = 1001插入表后,它应该获得的下一个结果应该是1004,因为表中已经存在10001003

根据我在网上看到的所有内容,我认为我必须使用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/

10-16 07:40