【问题标题】:How do i make a hierarchical Oracle query?如何进行分层 Oracle 查询?
【发布时间】:2021-05-04 14:21:57
【问题描述】:

我有以下数据:

结构:

id parent_id
1 null
1.1 1
1.1.1 1.1
1.1.2 1.1
2 null
2.1 2
2.1.1 2.1
2.2 2
2.2.1 2.2

价值观:

id value
1.1.1 10
1.1.1 15
1.1.2 5
2.1.1 20
2.2.1 10

我想带来以下结果:

id value
1 30
1.1 30
1.1.1 25
1.1.2 5
2 30
2.1 20
2.1.1 20
2.2 10
2.2.1 10

我需要一个 oracle 查询来给我这个结果,知道怎么做吗?

PS:我知道如何用 subselect 解决这个问题,但是我需要一种更有效的方法

【问题讨论】:

  • 请展示您尝试过的内容。还将您的示例数据呈现为 db fiddle 或 CTE 以供即时使用。
  • 几年前我在 asktom 上问过一个类似的问题。这可能会让你走上正轨:asktom.oracle.com/pls/apex/…
  • 您正在寻找 CONNECT BY。

标签: sql oracle


【解决方案1】:

你可以使用:

SELECT id,
       SUM( value ) AS total
FROM   (
  SELECT CONNECT_BY_ROOT(s.id) AS id,
         v.value
  FROM   structure s
         LEFT OUTER JOIN structure_values v
         ON ( v.id = s.id )
  WHERE  v.value IS NOT NULL
  CONNECT BY PRIOR s.id = s.parent_id
)
GROUP BY id
ORDER BY id

其中,对于样本数据:

CREATE TABLE structure ( id, parent_id ) AS
SELECT '1',     null  FROM DUAL UNION ALL
SELECT '1.1',   '1'   FROM DUAL UNION ALL
SELECT '1.1.1', '1.1' FROM DUAL UNION ALL
SELECT '1.1.2', '1.1' FROM DUAL UNION ALL
SELECT '2',     null  FROM DUAL UNION ALL
SELECT '2.1',   '2'   FROM DUAL UNION ALL
SELECT '2.1.1', '2.1' FROM DUAL UNION ALL
SELECT '2.2',   '2'   FROM DUAL UNION ALL
SELECT '2.2.1', '2.2' FROM DUAL;

CREATE TABLE structure_values ( id, value ) AS
SELECT '1.1.1', 10 FROM DUAL UNION ALL
SELECT '1.1.1', 15 FROM DUAL UNION ALL
SELECT '1.1.2',  5 FROM DUAL UNION ALL
SELECT '2.1.1', 20 FROM DUAL UNION ALL
SELECT '2.2.1', 10 FROM DUAL;

输出:

ID TOTAL
1 30
1.1 30
1.1.1 25
1.1.2 5
2 30
2.1 20
2.1.1 20
2.2 10
2.2.1 10

db小提琴here

【讨论】:

  • 这么好的、很棒的和聪明的解决方案。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多