在Oracle SQL查询中创建增量编号


13

如何在不创建任何表的情况下在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

我想要的预期结果是:

2008
2009
2010
2011

Answers:


14

与Kerri的答案类似,但没有with(且受SO答案启发):

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

     YEARS
----------
      2008
      2009
      2010
      2011

或者,如果您的目标是获取当前年份的前三个年份,而不用硬编码起始年份:

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

1
我认为我将为我的代码选择此代码,它比使用With子句简单得多
50LV3R11年


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;

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


在MS SQL中也进行了稍作修改的作品 WITH T3(Years) AS ( SELECT 2008 Years UNION ALL SELECT Years + 1 FROM T3 WHERE Years < 2011 ) SELECT * FROM T3;
Mira173173'9

@ miracle173有趣的是,只需删除FROM dual
Leigh Riffel 2012年

dual是特定于oracle的表。其他数据库(例如MS SQL Sever,mysql,postgres)允许使用语句select expression。mysql确实也知道一个双重表
miracle173 '09

4

为什么不只是创建一个序列?

CREATE SEQUENCE TEMP_YEAR_sEQUENCE START WITH 2008;

SELECT TEMP_YEAR_sEQUENCE.NEXTVAL FROM DUAL; 

....

DROP SEQUENCE TEMP_YEAR_SEQUENCE;

编辑:

对于较小范围的序列值,您可以使用如下所示的内容:

select ROWNUM + 10   # start value
from ALL_OBJECTS 
where ROWNUM <= 5 ;  # count of values 

您只需要一个具有足够行数的表。


3
琐碎的事情看起来像是很多开销,而DDL会执行隐式的提交,这是意料之外的。并且发出查询的用户可能没有创建序列的权限。
Alex Poole

我同意Alex Poole的观点,但无论如何,这仍然是另一种解决方法
50LV3R 2011年

-1的原因是@AlexPoole指出的。如果重新执行查询而不重新创建序列,则会得到不同的结果。
miracle173 2012年

使用该序列的查询不会返回所需的数字集。
miracle173

-1

这是一个基于case语句添加多个标志并对其进行递增的示例。

WITH T3(FLAG1,FLAG2,FLAG3,tt,OTHER_DATA)  
AS (    
SELECT '0' FLAG1, '0' FLAG2, '0' FLAG3 , current_timestamp  tt , 'dummy'  OTHER_DATA 
FROM dual 
UNION ALL  
SELECT case when cast( FLAG2 as int) > 5 then
cast ((cast(FLAG1 as int) + 1) as varchar2(30)) else  FLAG1 end FLAG1,
cast((cast(FLAG2 as int) + 1) as varchar2(30)) FLAG2  ,case when (
(FLAG2 ='3') or (FLAG2 = '4')) then cast ((cast(  FLAG3 as int) + 1)
as varchar2(30)) else FLAG3 end FLAG3  ,current_timestamp  tt ,
'ACTUAL' OTHER_DATA FROM T3 WHERE FLAG2 < 10   
)
SELECT * FROM T3
WHERE OTHER_DATA != 'dummy' ;

-结果集如下

Flag1   Flag2   Flag3   TT                                              OTHER_DATA
0       1       0       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       2       0       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       3       0       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       4       1       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       5       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       6       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
1       7       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
2       8       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
3       9       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
4      10       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL   

2
为什么所有在字符串和数字之间进行强制转换?并非完全确定这会增加现有答案,因为OP似乎并没有在寻找这些东西。
亚历克斯·普尔

-1

用rownum从1到1依次增加rownum + 100。

101、102等的结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.