我有一张这样的表
parent_item child_item quantity
A B 2
A C 3
B E 1
B F 2
并希望根据数量将其分成多行
parent_item child_item quantity
A B 1
A B 1
A C 1
A C 1
A C 1
B E 1
B F 1
B F 1
The column quantity (1) is not really necessary.
我能够在/ level连接的帮助下生成一些东西,但是对于大型表来说它非常慢。我不熟悉connect / level,但这似乎有用,虽然我不能真的解释一下:
select distinct parent_item, level LEVEL_TAG, child_item, level||quantity
FROM table
CONNECT BY quantity>=level
order by 1 asc;
我发现了类似的问题,但在大多数情况下,topicstarter希望将分隔的列值拆分为多行(Oracle - split single row into multiple rows)
解决此问题的最佳方法是什么?
由于
答案 0 :(得分:6)
使用递归子查询分解子句:
WITH split ( parent_item, child_item, lvl, quantity ) AS (
SELECT parent_item, child_item, 1, quantity
FROM your_table
UNION ALL
SELECT parent_item, child_item, lvl + 1, quantity
FROM split
WHERE lvl < quantity
)
SELECT parent_item, child_item, 1 As quantity
FROM split;
或者您可以使用相关的分层查询:
SELECT t.parent_item, t.child_item, 1 AS quantity
FROM your_table t,
TABLE(
CAST(
MULTISET(
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= t.quantity
)
AS SYS.ODCINUMBERLIST
)
) l;
至于哪个更高效 - 尝试对不同的解决方案进行基准测试,因为我们无法告诉您什么会在您的系统上更高效。