【问题标题】:OracleSQL: generate a horizontal view from father-son tableOracle SQL:从父子表生成水平视图
【发布时间】:2021-07-29 14:12:14
【问题描述】:

我有一个这样结构的表:

  • 元素
  • 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,输出应该复制叶子,直到达到最后一层。

我怎样才能得到这个结果?

谢谢

【问题讨论】:

  • 请显示您目前拥有的代码:您尝试了什么,有什么问题?您是否有可变数量的列,或者它们受到某个固定的可能数量的限制?实际上还有两个问题:关于层次结构和日期过滤(当源数据中不存在日期字段时)。请每个问题只问一个问题。
  • 感谢您的评论和建议,我删除了数据过滤部分,现在我正在编辑添加我尝试过的查询的问题。

标签: sql oracle tree hierarchy connect-by


【解决方案1】:

您可以使用递归子查询分解子句:

WITH levels ( liv0, liv1, liv2, liv3, liv4, lvl ) AS (
  SELECT element, father_element, null, null, null, 1 FROM table_name
UNION ALL
  SELECT liv0,
         liv1,
         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,
       liv1,
       liv2,
       liv3,
       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 Y Y Y Y

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    相关资源
    最近更新 更多