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

时间:2018-05-23 07:04:14

标签: sql oracle oracle12c

我正在使用connect by尝试以下查询,但我收到了关系错误,但是它还没有完成,我不认为还有其他方法可以做到这一点。

这是查询

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

我想得到如下结果:

3
6
9
12
..
..
45

2 个答案:

答案 0 :(得分:3)

尝试以下

    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

答案 1 :(得分:1)

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

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仅仅是一个字面值,不能用作条件(它不能评估为&#34; true&#34;或&#34; false&#34;)。如果我们修复它现在是一个条件:

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是多余的,可以删除;因此你得到了user75ponic提出的答案,它的工作正常。