SQL序列中的下N个数字

时间:2018-07-12 09:35:03

标签: sql oracle mariadb

假设我有一个SQL序列seq。我可以在一个语句中从中提取N下一个数字吗(N是可变的,所以我不能只提取N列)?

我知道在Oracle数据库中我可以使用以下查询:

select seq.nextval from dual connect by level <= ?

返回(例如)的

NEXTVAL
15
16
17

我对在MariaDB中执行相同操作特别感兴趣,但是使用标准SQL的操作会更好。

3 个答案:

答案 0 :(得分:1)

您可以使用递归CTE:

WITH RECURSIVE cte AS (
  SELECT 1 AS v
  UNION ALL
  SELECT v+1
  FROM cte
  WHERE v < 3   -- here goes limit
)
SELECT seq.nextval
FROM cte;

DBFiddle Demo


另一种方法是设置INCREMENT BY 3。然后您将获得第一个数字,并可以在应用程序级别上推断出下两个值。

编辑:

  

问题被标记为Oracle,以上解决方案在oracle中不起作用。我们不是通过这种方式在Oracle中实现递归,而是通过多次CTE。

Oracle也支持递归CTE。

WITH cte(v) AS (
  SELECT 1 FROM dual
  UNION ALL
  SELECT v+1
  FROM cte
  WHERE v < 3
)
SELECT seq.NEXTVAL
FROM cte;

DBFiddle Demo

答案 1 :(得分:1)

由于您似乎正在使用MariaDB,请使用它的“序列”东西。像这样:

SELECT @base + n FROM seq_1_to_999999 WHERE n <= @N;

伪表的行数超出了您的需要,但是WHERE子句将其限制为您的@变量。

像这样的序列早于CTE可用。

答案 2 :(得分:0)

不知道获取n个序列和浪费序列的目的。无论如何,如果您想要那样,那么您可以使用具有所需记录数的任何表,并使用以下sql并获取序列 从限制中选择seq.nextval吗?

注意:该表中的记录数应大于或等于给定的限制数