2016-08-04 5 views
5

OracleでCTEを作成しようとしていますが、既存のテーブルから選択せず、代わりにデータが挿入されています。現在、私はテーブルを作成し、クエリが完了した後にそれをドロップしています。効果的に同じことを行うCTEを作成する方法はありますか?これは私の現在のコードです:OracleでのCTEの作成

create table RTG_YEARS 
(YR date); 

insert into RTG_YEARS values (to_date('2013-01-01', 'yyyy-mm-dd')); 
insert into RTG_YEARS values (to_date('2013-12-31', 'yyyy-mm-dd')); 
insert into RTG_YEARS values (to_date('2014-01-01', 'yyyy-mm-dd')); 
insert into RTG_YEARS values (to_date('2014-12-31', 'yyyy-mm-dd')); 
insert into RTG_YEARS values (to_date('2015-01-01', 'yyyy-mm-dd')); 
insert into RTG_YEARS values (to_date('2015-12-31', 'yyyy-mm-dd')); 

答えて

8

あなたはデュアルから日付値を選択し、すべてを一緒に合併することで、あなたの共通テーブル式(CTE、subquery factoringなど)を作成することができます。

with RTG_YEARS (YR) as (
    select to_date('2013-01-01', 'yyyy-mm-dd') from dual 
    union all select to_date('2013-12-31', 'yyyy-mm-dd') from dual 
    union all select to_date('2014-01-01', 'yyyy-mm-dd') from dual 
    union all select to_date('2014-12-31', 'yyyy-mm-dd') from dual 
    union all select to_date('2015-01-01', 'yyyy-mm-dd') from dual 
    union all select to_date('2015-12-31', 'yyyy-mm-dd') from dual 
) 
select * from RTG_YEARS; 

YR  
---------- 
2013-01-01 
2013-12-31 
2014-01-01 
2014-12-31 
2015-01-01 
2015-12-31 

しませんそれはCTEであることに関連していますが、date literalsを使用してビットを入力して減らすことができます

with RTG_YEARS (YR) as (
    select date '2013-01-01' from dual 
    union all select date '2013-12-31' from dual 
    union all select date '2014-01-01' from dual 
    union all select date '2014-12-31' from dual 
    union all select date '2015-01-01' from dual 
    union all select date '2015-12-31' from dual 
) 
select * from RTG_YEARS; 
+0

感謝を!私は二重のテーブルについて話している他の投稿を見ていましたが、それが何であるか分かりませんでした。これは本当に役立ちます。 – mosk915

+0

@ mosk915 - [DUALから選択]に関するドキュメント(http://docs.oracle.com/cd/E11882_01/server.112/e41084/queries009.htm#SQLRF20036)で少し説明しています。 –

関連する問題