循环获取 table 中的下一个不可用号码
Loop to get next unavailable number in table
我想查询 table 以查看 Number 是否存在,如果存在,请检查 Number+ 1 并使用递归。我需要输出下一个不存在的更高值。
示例:
Table_A
**id - Number - Year**
**11 - 01 - 2021**
**12 - 02 - 2021**
**13 - 10 - 2021**
**18 - 11 - 2021**
**19 - 12 - 2021**
查询 checkNumber(11) 应该 return - 13
查询 checkNumber(13) 应该 return - 13
查询 checkNumber(1) 应该 return - 3
我如何为此创建递归 CTE,或者在 SQL 服务器中使用其他方法是否更好?
为此您不需要递归 CTE。相反,您只需要对相邻值的范围进行分组并选择第一个。
假设传入的number
在table的取值范围内(题中所有例子都是如此),可以使用:
select top (1) max(number) + 1
from (select a.*, row_number() over (order by id) as seqnum
from table_a a
) a
where number >= 1
group by (number - seqnum)
order by min(id);
Here 是一个 db<>fiddle.
我能够使用以下循环实现此目的:
declare @CurrentNumber int;
Set @CurrentNumber = // some initial value can be set based on requirement
WHILE ((Select 1 from Table_A where Number = @CurrentNumber and other conditions..)IS not null)
BEGIN
SET @CurrentNumber = @CurrentNumber + 1;
END;
PRINT(@CurrentNumber);
我想查询 table 以查看 Number 是否存在,如果存在,请检查 Number+ 1 并使用递归。我需要输出下一个不存在的更高值。
示例:
Table_A
**id - Number - Year**
**11 - 01 - 2021**
**12 - 02 - 2021**
**13 - 10 - 2021**
**18 - 11 - 2021**
**19 - 12 - 2021**
查询 checkNumber(11) 应该 return - 13
查询 checkNumber(13) 应该 return - 13
查询 checkNumber(1) 应该 return - 3
我如何为此创建递归 CTE,或者在 SQL 服务器中使用其他方法是否更好?
为此您不需要递归 CTE。相反,您只需要对相邻值的范围进行分组并选择第一个。
假设传入的number
在table的取值范围内(题中所有例子都是如此),可以使用:
select top (1) max(number) + 1
from (select a.*, row_number() over (order by id) as seqnum
from table_a a
) a
where number >= 1
group by (number - seqnum)
order by min(id);
Here 是一个 db<>fiddle.
我能够使用以下循环实现此目的:
declare @CurrentNumber int;
Set @CurrentNumber = // some initial value can be set based on requirement
WHILE ((Select 1 from Table_A where Number = @CurrentNumber and other conditions..)IS not null)
BEGIN
SET @CurrentNumber = @CurrentNumber + 1;
END;
PRINT(@CurrentNumber);