SELECTにWITH句を利用することで一時表を作成することが出来ます。
さらに、その一時表を利用した新たなSELECTを発行することが出来ます。
join句を利用して同一の結果を返すことが出来ますが、見やすさ的にも、パフォーマンス的にもWITH句を利用した方が優れているようです。
select 1 one_col1, 10 one_col2 from dual
ONE_COL1 ONE_COL2
---------- ----------
1 10
例えば上記のSELECT文をWITH句で一時表としてまとめてみます。
WITH
one AS (
select 1 one_col1, 10 one_col2 from dual
)
select one_col1 + 1 from one;
ONE_COL1+1
----------
2
一時表にoneという名前を付けて、次のSELECT文で利用しています。
WITH
one AS (
select 1 one_col1, 10 one_col2 from dual
),
ones_next AS (
select one_col1 + 1 from one
)
select * from ones_next;
ONE_COL1+1
----------
2
また、一時表を利用して新たな一時表を作ることも可能です。
oneという一時表を利用して、ones_nextという一時表を作成しています。
select 1 from dual;
1
----------
1
また、今度は上記の一時表を作成します。
WITH
ones_next (col) AS (
select 1 from dual
)
select * from ones_next;
COL
----------
1
ones_nextという一時表を作成しています。
また、列名にcolという名前を付けています。
WITH
ones_next (col) AS (
select 1 from dual
union all
select 1 + col from ones_next where col < 5
)
select * from ones_next;
COL
----------
1
2
3
4
5
さらにones_nextという一時表の中で同じones_nextを利用する・・・という再帰的にWITH句を作成することも可能になります。
11gからの機能になります。
少し複雑になっていまいますが・・・
さらに、その一時表を利用した新たなSELECTを発行することが出来ます。
join句を利用して同一の結果を返すことが出来ますが、見やすさ的にも、パフォーマンス的にもWITH句を利用した方が優れているようです。
select 1 one_col1, 10 one_col2 from dual
ONE_COL1 ONE_COL2
---------- ----------
1 10
例えば上記のSELECT文をWITH句で一時表としてまとめてみます。
WITH
one AS (
select 1 one_col1, 10 one_col2 from dual
)
select one_col1 + 1 from one;
ONE_COL1+1
----------
2
一時表にoneという名前を付けて、次のSELECT文で利用しています。
WITH
one AS (
select 1 one_col1, 10 one_col2 from dual
),
ones_next AS (
select one_col1 + 1 from one
)
select * from ones_next;
ONE_COL1+1
----------
2
また、一時表を利用して新たな一時表を作ることも可能です。
oneという一時表を利用して、ones_nextという一時表を作成しています。
select 1 from dual;
1
----------
1
また、今度は上記の一時表を作成します。
WITH
ones_next (col) AS (
select 1 from dual
)
select * from ones_next;
COL
----------
1
ones_nextという一時表を作成しています。
また、列名にcolという名前を付けています。
WITH
ones_next (col) AS (
select 1 from dual
union all
select 1 + col from ones_next where col < 5
)
select * from ones_next;
COL
----------
1
2
3
4
5
さらにones_nextという一時表の中で同じones_nextを利用する・・・という再帰的にWITH句を作成することも可能になります。
11gからの機能になります。
少し複雑になっていまいますが・・・
