3

在一个表中,我有 id 为 2、4、5、8 的记录。如何接收值为 1、3、6、7 的列表。我试过这种方式

SELECT t1.id + 1
FROM table t1
WHERE NOT EXISTS (
    SELECT * 
    FROM table t2
    WHERE t2.id = t1.id + 1
)

但它不能正常工作。它不会带来所有可用的职位。

没有另一张桌子可以吗?

4

1 回答 1

4

您可以从递归 CTE 中获取所有缺少的 ID,如下所示:

with recursive numbers as (
  select 1 number
    from rdb$database
  union all
  select number+1
    from rdb$database
         join numbers on numbers.number < 1024
)
select n.number
  from numbers n
 where not exists (select 1 
                     from table t
                    where t.id = n.number)

我的示例中的number < 1024条件将查询限制为最大 1024 递归深度。之后,查询将以错误结束。如果您需要超过 1024 个连续ID,您可以多次运行查询来调整生成的数字的间隔,或者考虑在不同的查询中产生连续的数字而不会达到递归级别,这并不难编写。

于 2013-01-29T19:33:32.917 回答