sql-server - 获取数字序列中缺失的值

标签 sql-server ms-access ms-access-2010

我对 SQL Server 后端进行了以下查询

SELECT TOP(1) (v.rownum + 99)
FROM
    (
        SELECT incrementNo-99 as id, ROW_NUMBER() OVER (ORDER BY incrementNo) as rownum
        FROM proposals
        WHERE [year] = '12'
    )  as v
WHERE v.rownum <> v.id
ORDER BY v.rownum

查找第一个未使用的提案编号。 (与最后一条记录+1无关)

但我意识到 Access 不支持ROW_NUMBER。 我查了一下,没有找到类似的东西。

有人知道如何在 Access 中获得与 ROW_NUMBER 相同的结果吗?

也许有更好的方法来做到这一点。

实际上人们插入他们的提案N​​o(incrementID)没有任何限制。这个数字看起来像这样 13-152。 xx- 代表当年,-xxx 是提案编号。最后 3 位数字应该是递增的,但在某些情况下,每年可能需要跳过 10 次一些数字。这就是为什么我不能自动增量的原因。

所以我执行此查询,以便当他们打开表单时,默认号码是第一个未使用的

它是如何工作的:

因为数字从 100 开始,所以我选择 -99,所以它从 1 开始。

然后我将行号与 id 进行比较,看起来像这样

ROW NUMBER      |       ID
1                        1                 (100)
2                        2                 (101)
3                        3                 (102)
4                        5                 (104)<--------- WRONG  
5                        6                 (105)

现在我知道我们跳过了 4。所以我返回 (4 - 99) = 103

如果有更好的方法,我不介意改变,但我真的很喜欢这个查询。

如果确实没有其他方法并且我无法在 Access 中模拟行号,我将使用传递查询。

谢谢

最佳答案

从您的问题看来,您正在寻找数字序列中的间隙,因此:

SELECT b.akey, (
    SELECT Top 1 akey 
    FROM table1 a 
    WHERE a.akey > b.akey) AS [next] 
FROM table1 AS b 
WHERE (
    SELECT Top 1 akey 
    FROM table1 a 
    WHERE a.akey > b.akey) <> [b].[akey]+1
ORDER BY b.akey

其中table1是表,akey是序列号。

关于sql-server - 获取数字序列中缺失的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13070244/

相关文章:

mysql - 通过从 SQL Server 中的多个表中选择不同的列来创建 View

SQL Server 触发器在插入和更新后未触发

sql-server - 使用左连接后如何使用 case 语句?

sql - MS Access 索引 View

sql - 如何在列表框中显示多个字段?

ms-access - 如何在 Access 2010 中使用 .mdw 文件

ms-access - 多选列表框问题

SQL - 查找重复值并在字段中删除

sql - 这个sql语句有什么问题?

sql - 从 VBA 中的 Access 表中删除和添加 ID 键索引