To understand how the integer series generator described in the CUBE Method tutorial works we will start with a simple query, transform it into a query that uses CUBE the traditional way, and then turn it into an integer series generator for the values 1 to 4. (Read the Oracle manual page on the CUBE grouping operation first if you are not already familiar with this feature.)
set null "(null)" |
|
select * from t2 ; |
C1 C2 C3 ------ ------ ---------- x y 42 |
select c1, c2, sum( c3 ) as sum_c3 from t2 GROUP BY C1, C2 ; |
C1 C2 SUM_C3 ------ ------ ---------- x y 42 |
select c1, c2, sum( c3 ) as sum_c3 from t2 group by CUBE( c1, c2 ); |
C1 C2 SUM_C3 ------ ------ ---------- (null) (null) 42 (null) y 42 x (null) 42 x y 42 |
select c1, c2, 1 AS ANY_LITERAL from t2 group by cube( c1, c2 ); |
C1 C2 ANY_LITERAL ------ ------ ----------- (null) (null) 1 (null) y 1 x (null) 1 x y 1 |
SELECT 1 from t2 group by cube ( c1, c2 ) ; |
1
----------
1
1
1
1
|
select 1 from t2 group by CUBE ( 1, 2 ) -- see Note 1 ; |
1
----------
1
1
1
1
|
select ROWNUM AS INTEGER_VALUE from ( select 1 from t2 group by cube ( 1, 2 ) ); |
INTEGER_VALUE
-------------
1
2
3
4
|
select rownum as integer_value from ( select 1 from t2 group by cube ( 1, 2 ) ) where ROWNUM <= 3 ; |
INTEGER_VALUE
-------------
1
2
3
|
Note 1: In this technique it does not matter what literals you use in the
arguments to CUBE.
You could use arguments like
1, 1 or
'a','b'
and still get the same number of rows.
The important part is how many literals you include.
Two literals will give you four rows (2^2),
three literals will give you eight rows (2^3),
four literals will give you sixteen rows (2^4),
etc.
I like to use arguments like
1,2,3,4,5,6,7
because it is easier to tell there are 7 arguments
(which produce 2^7 rows)
with this approach than with an argument list like
1,1,1,1,1,1,1.
