问题描述
- 元素
- FATHER_ELEMENT
- INITIAL_DATE
- END_DATE
我可以有这种情况:
| ELEMENT| FATHER_ELEMENT|
|--------|---------------|
| A | B |
| A | C |
| B | D |
| D | E |
| X | Y |
我想要这个输出:
| LIV0| LIV1|LIV2| LIV3| LIV4|
|-----|-----|----|-----|-----|
| A | B |D |E |E |
| A | C |C |C |C |
| B | D |D |D |D |
| X | Y |Y |Y |Y |
基本上,我想从所有父亲开始生成一些行,并为每条路径生成 1 条记录,直到到达不同的叶子,我希望它使用 12 级(在示例中有 5 个级别),并且,如果例如,对于路径,我有 deep = 4,输出应该复制叶子直到到达最后一层。
我怎样才能得到那个结果?
谢谢
解决方法
您可以使用递归子查询分解子句:
WITH levels ( liv0,liv1,liv2,liv3,liv4,lvl ) AS (
SELECT element,father_element,null,1 FROM table_name
UNION ALL
SELECT liv0,CASE l.lvl
WHEN 1 THEN COALESCE( t.father_element,l.liv1 )
ELSE l.liv2
END,CASE l.lvl
WHEN 2 THEN COALESCE( t.father_element,l.liv2 )
ELSE l.liv3
END,CASE l.lvl
WHEN 3 THEN COALESCE( t.father_element,l.liv3 )
ELSE l.liv4
END,l.lvl + 1
FROM levels l
LEFT OUTER JOIN table_name t
ON ( CASE l.lvl
WHEN 1 THEN l.liv1
WHEN 2 THEN l.liv2
WHEN 3 THEN l.liv3
END = t.element )
WHERE l.lvl < 4
)
SELECT liv0,liv4
FROM levels
WHERE lvl = 4
对于样本数据:
CREATE TABLE table_name ( ELEMENT,FATHER_ELEMENT ) AS
SELECT 'A','B' FROM DUAL UNION ALL
SELECT 'A','C' FROM DUAL UNION ALL
SELECT 'B','D' FROM DUAL UNION ALL
SELECT 'D','E' FROM DUAL UNION ALL
SELECT 'X','Y' FROM DUAL;
输出:
LIV0 | LIV1 | LIV2 | LIV3 | LIV4 |
---|---|---|---|---|
A | C | C | C | C |
A | B | D | E | E |
B | D | E | E | E |
D | E | E | E | E |
X | 是 | 是 | 是 | 是 |
dbfiddle here