テーブルを作成せずに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
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;
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を調整して、異なる結果を取得します。
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)
。
なぜシーケンスを作成しないのですか?
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
十分な数の行を持つテーブルが必要です。