在oracle sql查询中创建增量数

50L*_*V3R 13 oracle-10g

如何在不创建任何表的情况下在oracle sql查询中创建增量数?我曾尝试使用“with”子句,但没有得到预期的结果。我正在使用 oracle 10g

这是我尝试的代码,它似乎不起作用:

WITH
TABLE3 AS ( SELECT 2008 YEARS FROM dual WHERE 1=1
union all
select t3.YEARS+1 from TABLE3 t3
WHERE 1=1 AND t3.YEARS < 2011
)

select YEARS from TABLE3
Run Code Online (Sandbox Code Playgroud)

我想要的预期结果是:

2008
2009
2010
2011
Run Code Online (Sandbox Code Playgroud)

Ker*_*tts 16

认为这会起作用(基于此页面(http://psoug.org/definition/LEVEL.htm)作为起点):

WITH counter
AS ( SELECT LEVEL seq
       FROM DUAL
     CONNECT BY LEVEL <= 4 )
SELECT (2008 + seq - 1) myYear
  FROM counter
 ORDER BY 1
;
Run Code Online (Sandbox Code Playgroud)

这应该返回:

myYear
------
  2008
  2009
  2010
  2011
Run Code Online (Sandbox Code Playgroud)

调整 2008 和 4 以获得不同的结果。


Ale*_*ole 14

类似于 Kerri 的答案,但没有with(并受到SO 答案的启发):

SELECT 2007 + LEVEL AS YEARS
FROM DUAL
CONNECT BY LEVEL <= 4;

     YEARS
----------
      2008
      2009
      2010
      2011
Run Code Online (Sandbox Code Playgroud)

或者,如果您的目标是获得当前年份之前的三个年份,而无需硬编码开始年份:

SELECT EXTRACT(YEAR FROM SYSDATE) + 1 - LEVEL AS YEARS
FROM DUAL
CONNECT BY LEVEL <= 4
ORDER BY YEARS;
Run Code Online (Sandbox Code Playgroud)


Lei*_*fel 5

看起来 OP 试图使用递归子查询来解决问题。这在 10g 中不起作用,因为直到 11.2 才添加该功能,但在 11.2+ 中,以下内容也将是该问题的有效解决方案。

WITH T3(Years) AS (
   SELECT 2008 Years FROM dual
   UNION ALL
   SELECT Years + 1 FROM T3 WHERE Years < 2011
   )
SELECT * FROM T3;
Run Code Online (Sandbox Code Playgroud)

OP 的查询中唯一缺少的是(YEARS).