I am trying to create a CTE
in Oracle
that doesn’t select from an existing table but instead has data inserted into it. Currently, I am creating a table and then dropping it after the query
is done. Is there a way to create a CTE
that effectively does the same thing? This is my current code:
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'));
Advertisement
Answer
You can create your common table expression (CTE, subquery factoring, etc.) by selecting the date values from dual, and unioning them all together:
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
Not related to it being a CTE, but you can reduce the typing a bit by using 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;