如何从SQL Server获取“下一个可用号码”? (不是标识列)

时间:2011-07-19 21:59:44

标签: sql-server sql-server-2008

技术:SQL Server 2008

所以我尝试了一些我在SO上找到的选项,但没有真正为我提供明确的答案。

我有一个包含两列的表,(Transaction ID,GroupID),其中没有唯一值。例如:

TransID | GroupID
-----------------
23      | 4001
99      | 4001
63      | 4001
123     | 4001   
77      | 2113
2645    | 2113
123     | 2113
99      | 2113   

最初,groupID只是由用户随机选择,但现在我们正在自动化它。事实是,我们保留现有数据库而不对现有数据进行任何更改(工作太多,收益太少)

有没有办法在表“GroupTransactions”上查询“GroupID”以获取GroupID的下一个可用值> 2000?

4 个答案:

答案 0 :(得分:8)

我想从你提出的下一个问题开始,虽然这可能与max + 1不一样吗? - 在这种情况下:

从整数列表开始,查找groupid列中不存在的整数,例如:

;WITH CTE_Numbers AS (
    SELECT n = 2001
    UNION ALL
    SELECT n + 1 FROM CTE_Numbers WHERE n < 4000 
)
SELECT top 1 n 
FROM CTE_Numbers num
WHERE NOT EXISTS (SELECT 1 FROM MyTable tab WHERE num.n = tab.groupid)
ORDER BY n

注意:您需要调整CTE中的2001/4000值以允许您想要的范围。我假设您的表名为MyTable

答案 1 :(得分:2)

select max(groupid) + 1 from GroupTransactions

答案 2 :(得分:1)

以下将找到2000年以下的下一个差距:

SELECT MIN(t.GroupID)+1 AS NextID
FROM GroupTransactions t (updlock)
WHERE NOT EXISTS
(SELECT NULL FROM GroupTransactions n WHERE n.GroupID=t.GroupID+1 AND n.GroupID>2000)
AND t.GroupID>2000

答案 3 :(得分:0)

总是有很多方法可以完成所有事情。我这样做是解决了这个问题:

declare @i int = null 

declare @t table (i int)
insert into @t values (1)
insert into @t values (2)
--insert into @t values (3)
--insert into @t values (4)
insert into @t values (5)
--insert into @t values (6)

--get the first missing number
select   @i = min(RowNumber)
from (
select  ROW_NUMBER() OVER(ORDER BY i) AS RowNumber, i
    from (
        --select distinct in case a number is in there multiple times
        select distinct i
        from @t
        --start after 0 in case there are negative or 0 number
        where i > 0
    ) as a
) as b 
where RowNumber <> i

--if there are no missing numbers or no records, get the max record
if @i is null
    begin
    select @i = isnull(max(i),0) + 1 from @t
    end

select @i