ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

連番を生成する SELECT文(階層問い合わせ+LEVEL疑似列)

ちょっとした疑似レコードをSELECTだけで簡単に作れるので、非常に便利です。
階層問い合わせ(CONNECY BY〜) と LEVEL疑似列を使用します。

Oracle Database SQL言語リファレンス 11gリリース2 (11.2) B56299-06
LEVEL疑似列
http://docs.oracle.com/cd/E16338_01/server.112/b56299/pseudocolumns001.htm#i1009261

以下は実行例です。

-- 10g以降
 SELECT LEVEL
   FROM DUAL
CONNECT BY LEVEL <= 10;

     LEVEL
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

9iR2以前は↓のSQLを実行します。

-- 9iR2以前
 SELECT LEVEL
   FROM DUAL A, DUAL B
CONNECT BY A.DUMMY = B.DUMMY
    AND LEVEL <= 10;

     LEVEL
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

下記のように日付を生成したり、応用は色々効きまくり(`・ω・)Ъ

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS';
 SELECT TRUNC(SYSDATE, 'DD') + LEVEL - 1 AS WEEKLY_DAY
   FROM DUAL
CONNECT BY LEVEL <= 7;

WEEKLY_DAY
-------------------
2014/06/30 00:00:00
2014/07/01 00:00:00
2014/07/02 00:00:00
2014/07/03 00:00:00
2014/07/04 00:00:00
2014/07/05 00:00:00
2014/07/06 00:00:00

7 rows selected.