Oracle SQL 쿼리에서 증분 번호 만들기


13

테이블을 만들지 않고 Oracle SQL 쿼리에서 증분 번호를 만드는 방법은 무엇입니까? "with"절을 사용해 보았지만 예상 결과를 얻지 못했습니다. 나는 오라클 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

답변:


14

Kerri의 답변과 비슷하지만 with(및 SO 답변에서 영감을 얻음 ) :

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

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

또는 시작 연도를 하드 코딩하지 않고 현재 연도의 3 년을 얻는 것이 목표 인 경우 :

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

1
나는 내 코드를 위해 이것을 선택할 것이라고 생각한다. With 절을 사용하는 것보다 훨씬 간단하다.
50LV3R

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
;

이것은 다음을 반환해야합니다.

myYear
------
  2008
  2009
  2010
  2011

다른 결과를 얻으려면 2008 및 4를 조정하십시오.


5

OP가 재귀 하위 쿼리를 사용하여 문제를 해결하려고 시도한 것 같습니다. 이 기능은 11.2까지 추가되지 않았기 때문에 10g에서는 작동하지 않지만 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;
miracle173

@ miracle173 흥미롭고, 그냥 제거하십시오 FROM dual.
레이 리펠

dual오라클 고유 테이블입니다. MS SQL Sever, mysql, postgres와 같은 다른 데이터베이스는 다음과 같은 명령문을 허용합니다 select expression. mysql은 듀얼 테이블도 알고있다
miracle173

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

@AlexPoole이 언급 한 이유로 -1입니다. 시퀀스를 다시 만들지 않고 쿼리를 다시 실행하면 다른 결과가 나타납니다.
miracle173

시퀀스를 사용하는 쿼리는 원하는 숫자 집합을 반환하지 않습니다.
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가 찾고있는 것 같지 않기 때문에 이것이 기존 답변에 추가하는 것이 확실하지 않습니다.
Alex Poole

-1

rownum select rownum + 100을 "테이블"순서에서 1 씩 1 씩 증가 시키십시오.

101, 102 등의 결과

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.