代码之家  ›  专栏  ›  技术社区  ›  doublep

sql序列的下n个数字

  •  1
  • doublep  · 技术社区  · 8 年前

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

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

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

    返回(例如):

    NEXTVAL
    15
    16
    17
    

    我对在mariadb中做同样的事情特别感兴趣,但是使用标准sql会更好。

    3 回复  |  直到 8 年前
        1
  •  1
  •   Lukasz Szozda    8 年前

    可以使用递归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

        2
  •  1
  •   Rick James diyism    8 年前

    既然你好像在用mariadb,就用它的“sequence”thingie。像这样的:

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

    伪表的行数比您需要的多,但是 WHERE 子句将其限制为@variable。

    像这样的序列早在CTE出现之前就有了。

        3
  •  0
  •   Gaj    8 年前

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

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