Firebird获取包含所有可用ID的列表

时间:2013-01-29 13:51:21

标签: firebird firebird2.5

在表格中我有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
)

但它无法正常工作。它没有带来所有可用的职位。

没有另一张桌子可以吗?

1 个答案:

答案 0 :(得分: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 ,您可以多次运行查询来调整生成的数字的间隔,或者在另一个生成连续数字的查询中进行思考而不会达到递归级别,这也不是很难写。