| René Nyffenegger's collection of things on the web | |
|
René Nyffenegger on Oracle - Most wanted - Feedback
|
with [Oracle SQL] | ||
create table w (a number, b varchar2(10)); insert into w values (4, 'four'); insert into w values (8,'eight'); insert into w values (9, 'nine'); insert into w values (1, 'one'); with v as (select b from w where a > 5) select * from v;
Such a query is not too useful as it can also be written with a simple select * from w.
It is more useful however, if the query that is named with the with statment is used
more than once as a subquery.
Example: all permutations of 1..4
select m1, m2, m3, m4
from (
with one_to_four as (
select 1 n from dual union
select 2 n from dual union
select 3 n from dual union
select 4 n from dual
)
select n1.n m1, n2.n m2, n3.n m3, n4.n m4
from
one_to_four n1 cross join
one_to_four n2 cross join
one_to_four n3 cross join
one_to_four n4
where
n1.n not in (n2.n, n3.n, n4.n) and
n2.n not in ( n3.n, n4.n) and
n3.n not in ( n4.n)
);
The result:
M1 M2 M3 M4
---------- ---------- ---------- ----------
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
|