【发布时间】:2020-10-16 19:30:57
【问题描述】:
我想将一个表的行重复 n 次。
假设我有一个如下表
Tab1
A B C
-----
1 2 3
2 3 4
和 n =9
我想得到如下结果
1 2 3
2 3 4
1 2 3
2 3 4
1 2 3
2 3 4
1 2 3
2 3 4
1 2 3
我尝试了按级别连接,但没有得到预期的结果。
【问题讨论】:
标签: sql oracle select plsql recursive-query
我想将一个表的行重复 n 次。
假设我有一个如下表
Tab1
A B C
-----
1 2 3
2 3 4
和 n =9
我想得到如下结果
1 2 3
2 3 4
1 2 3
2 3 4
1 2 3
2 3 4
1 2 3
2 3 4
1 2 3
我尝试了按级别连接,但没有得到预期的结果。
【问题讨论】:
标签: sql oracle select plsql recursive-query
一种方法是递归查询。如果你想要 9 条记录,那么:
with cte(a, b, c, rn, cnt, lvl) as (
select a, b, c, row_number() over(order by a, b, c) rn, count(*) over() cnt, 0 lvl from mytable
union all
select a, b, c, rn, cnt, lvl + 1 from cte where lvl * cnt + rn < 8
)
select a, b, c from cte order by lvl, rn
这个想法是用row_number() 枚举原始行并计算它们。然后我们生成新行,并在达到目标行数时立即停止。这在某种程度上比生成比需要更多的行,然后过滤更有效。
【讨论】:
像这样?
SQL> with test (a, b, c) as
2 (select 1, 2, 3 from dual union all
3 select 2, 3, 4 from dual
4 ),
5 temp as
6 (select a, b, c,
7 row_number() over (order by column_value, a) rn
8 from test cross join table(cast(multiset(select level from dual
9 connect by level <= 9
10 ) as sys.odcinumberlist))
11 )
12 select a, b, c
13 from temp
14 where rn <= 9
15 order by rn ;
A B C
---------- ---------- ----------
1 2 3
2 3 4
1 2 3
2 3 4
1 2 3
2 3 4
1 2 3
2 3 4
1 2 3
9 rows selected.
SQL>
它有什么作用?
temp(第 5 - 11 行)创建了所有这些行; row_number 用于对它们进行“排名”,按column_value 排序(如果它离您更近,可以将其视为level 伪列)和a 列值(为什么?您的示例输出表明如此) )rn <= 9 的结果(因为您希望获得 9 行)【讨论】: