技术: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?
答案 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