sql - 查找 SQL Server 中最小的未使用数字

标签 sql sql-server gaps-and-islands

如何找到 SQL Server 列中最小的未使用数字?

我即将将大量手动记录的记录从 Excel 导入到 SQL Server 表中。它们都有一个数字 ID(称为文档编号),但由于不再适用的原因,它们没有按顺序分配,这意味着从现在开始,当我的网站记录新记录时,需要为其分配尽可能小的文档编号(大于零)尚未被采取。

有没有办法通过纯 SQL 来做到这一点,或者这是 TSQL/代码的问题吗?

谢谢!

编辑

特别感谢WW提出并发问题。鉴于这是一个网络应用程序,根据定义它是多线程的,任何面临同样问题的人都应该考虑使用代码或数据库级锁来防止冲突。

LINQ

仅供引用 - 这可以通过 LINQ 使用以下代码来完成:

var nums = new [] { 1,2,3,4,6,7,9,10};

int nextNewNum = (
    from n in nums
    where !nums.Select(nu => nu).Contains(n + 1)
    orderby n
    select n + 1
).First();

下一个新数 == 5

最佳答案

查找第一行不存在Id + 1的行

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

编辑:

为了处理现有的最低 id 不为 1 的特殊情况,这里有一个丑陋的解决方案:

SELECT TOP 1 * FROM (
    SELECT t1.Id+1 AS Id
    FROM table t1
    WHERE NOT EXISTS(SELECT * FROM table t2 WHERE t2.Id = t1.Id + 1 )
    UNION 
    SELECT 1 AS Id
    WHERE NOT EXISTS (SELECT * FROM table t3 WHERE t3.Id = 1)) ot
ORDER BY 1

关于sql - 查找 SQL Server 中最小的未使用数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/684106/

相关文章:

sql - 大日期范围内的最小/最大日期值取决于值

c# oracle sql 准备语句

mysql - IFNULL 无法正常工作

mysql - 如何优化此内连接查询以减少查询时间

sql - 检查字符是否为数字的最快方法?

c# - LINQ 查询具有连接的列的平均值,按连接表的键分组

sql-server - SQL Server : Null VS Empty String

postgresql - 查找日期范围Postgres之间的差距

sql - 按查询分组没有返回我期望的结果

mysql - SQL - 选择其列不遵循相同顺序的记录