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

使用Oracle SQL创建3到15的倍数

  •  1
  • JagaSrik  · 技术社区  · 6 年前

    我正在使用connect by尝试下面的查询,但是我得到了一个关系错误,在某种程度上它是不完整的,我认为没有其他方法可以做到这一点。

    这是询问

      select 3*level as X from dual 
         start with 1
         connect by  prior X < 15;
    

    我想得到如下结果:

    3
    6
    9
    12
    ..
    ..
    45
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Jacob    6 年前

    尝试如下操作

        SELECT 3 * LEVEL mult
          FROM DUAL
    CONNECT BY LEVEL <= 15;
    

    产量

    ╔══════╗
    ║ mult ║
    ╠══════╣
    ║    3 ║
    ║    6 ║
    ║    9 ║
    ║   12 ║
    ║   15 ║
    ║   18 ║
    ║   21 ║
    ║   24 ║
    ║   27 ║
    ║   30 ║
    ║   33 ║
    ║   36 ║
    ║   39 ║
    ║   42 ║
    ║   45 ║
    ╚══════╝
    

    SQL Fiddle Demo

        2
  •  1
  •   Jeffrey Kemp    6 年前

    只是为了解释你所看到的,供将来参考:

    select 3*level as X from dual 
    start with 1
    connect by  prior X < 15;
    
    ORA-00920: invalid relational operator
    Error at Line: 3 Column: 1
    

    这个错误实际上是在抱怨你的 start with 子句,必须具有 条件 ; 1 只是一个文本值,不能用作条件(它不能计算为“true”或“false”)。如果我们修复它,使其成为一个条件:

    select 3*level as X from dual 
    start with 1 = 1
    connect by  prior X < 15;
    
    ORA-00904: "X": invalid identifier
    Error at Line: 3 Column: 18
    

    现在,问题是 connect by 条件是指 X 它不是源数据中的列;很遗憾,不允许您引用在 select 条款。

    一般情况下你会更换 X 使用实际表达式,例如 3*level -但在这种情况下,这也不会起作用,因为您不能在 prior 表达式。

    相反,您可以这样做:

    select 3*level as X from dual 
    start with 1 = 1
    connect by level < 15;
    

    很明显, start with 1 = 1 是多余的,可以删除;因此您得到了由用户75ponic提出的答案,这个答案工作得很好。