OracleSQL:从父子表生成水平视图

问题描述

我有一个具有这种结构的表:

  • 元素
  • 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...