web-dev-qa-db-ja.com

Oracle SQLクエリで増分数を作成する

テーブルを作成せずに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
13
50LV3R

Kerriの回答に似ていますが、withがありません(そして SO answer に触発されています):

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;
14
Alex Poole

Ithinkこれで機能します(このページに基づいて( 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を調整して、異なる結果を取得します。

16
Kerri Shotts

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)

5
Leigh Riffel

なぜシーケンスを作成しないのですか?

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 

十分な数の行を持つテーブルが必要です。

4
bernd_k