我在SQL Server中的表上有一个主键(我使用的是版本9.00.4060.00 SP3标准版)。
假设它的值为1,2,3,5,17。
我可以按顺序遍历每一行,直到找到一个缺失值(在这种情况下为4),如果行数很小,那就没问题,但是如果有数百万行,第一个缺失的数字在中间这将需要很长时间。
是否有一些SQL Server内置功能可以快速执行此操作?
答案 0 :(得分:3)
这真的需要多长时间吗?
SELECT MIN(ID) + 1
FROM TableName t1
WHERE NOT EXISTS
(
SELECT 1 FROM TableName t2
WHERE ID = t1.ID + 1
)
编辑:我已经在一张包含约1亿条记录的桌子上进行了测试,这真的花了一些时间,比我想象的要多。在12522150处缺少主键,查询花了31秒。
您也可以使用ROW_NUMBER
,它可以在SQL-Server 2005上运行:
WITH CTE AS
(
SELECT ID, RN = ROW_NUMBER() OVER (ORDER BY ID)
FROM TableName
)
SELECT MIN(ID) + 1
FROM CTE
WHERE ID <> (RN - 1) + (SELECT MIN(ID) FROM TableName)
但这个查询甚至需要41秒。
两个查询都假定以下规则:
1000
,那么它不是第一个差距1002
1000,1001,1003
答案 1 :(得分:1)
stackoverflow上有一个类似的问题。看这里:Find the smallest unused number in SQL Server
SELECT TOP 1 t1.Id+1
FROM table t1
WHERE NOT EXISTS(SELECT * FROM table t2 WHERE t2.Id = t1.Id + 1)
ORDER BY t1.Id
答案 2 :(得分:0)
没有内置功能来执行此操作。你可以试试这样的东西
SELECT Min(ID) AS MIN_MISSING_ID
FROM (SELECT *,
RN= Row_number()OVER (ORDER BY ID)
FROM Yourtable) dt
WHERE RN < ID