t1 (ordered descending):
| a | comment |
|---|---|
| 512 | (ordered desc) |
| 415 | |
| 310 | |
| 205 | |
| 195 | |
| 150 | |
| 132 | |
| 90 | |
| 74 | |
| 20 | |
| 1 |
t2 (ordered ascending):
| b | comment |
|---|---|
| 10 | (ordered asc) |
| 11 | |
| 12 | |
| 13 |
I would like to create t3:
| a (desc) | b | comment |
|---|---|---|
| 512 | 10 | (b=asc) |
| 415 | 11 | |
| 310 | 12 | |
| 205 | 13 | |
| 195 | 13 | (b=desc) |
| 150 | 12 | |
| 132 | 11 | |
| 90 | 10 | |
| 74 | 10 | (b=asc) |
| 20 | 11 | |
| 1 | 12 |
etc.
In table t3, a is data from t1, and b is data from t2.
Advertisement
Answer
You can add a sequence number and then join using arithmetic:
select t1.*, t2.*
from (select t1.*,
row_number() over (order by a desc) as seqnum
from t1
) t1 left join
(select t2.*,
row_number() over (order by which,
case when which = 'a' then b end asc,
b desc
) as seqnum,
count(*) over () as cnt
from t2 cross join
(select 'a' as which from dual union all
select 'd' as which from dual
) x
) t2
on mod(t1.seqnum - 1, t2.cnt) = t2.seqnum - 1
order by t1.seqnum;