假设我有一个SQL序列seq
。我可以在一个语句中从中提取N
下一个数字吗(N
是可变的,所以我不能只提取N
列)?
我知道在Oracle数据库中我可以使用以下查询:
select seq.nextval from dual connect by level <= ?
返回(例如)的
NEXTVAL
15
16
17
我对在MariaDB中执行相同操作特别感兴趣,但是使用标准SQL的操作会更好。
答案 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;
另一种方法是设置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;
答案 1 :(得分:1)
由于您似乎正在使用MariaDB,请使用它的“序列”东西。像这样:
SELECT @base + n FROM seq_1_to_999999 WHERE n <= @N;
伪表的行数超出了您的需要,但是WHERE
子句将其限制为您的@变量。
像这样的序列早于CTE可用。
答案 2 :(得分:0)
不知道获取n个序列和浪费序列的目的。无论如何,如果您想要那样,那么您可以使用具有所需记录数的任何表,并使用以下sql并获取序列 从限制中选择seq.nextval吗?
注意:该表中的记录数应大于或等于给定的限制数