首页 > 解决方案 > 如何进行分层 Oracle 查询?

问题描述

我有以下数据:

结构体:

ID parent_id
1 空值
1.1 1
1.1.1 1.1
1.1.2 1.1
2 空值
2.1 2
2.1.1 2.1
2.2 2
2.2.1 2.2

价值观:

ID 价值
1.1.1 10
1.1.1 15
1.1.2 5
2.1.1 20
2.2.1 10

我想带来以下结果:

ID 价值
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:我知道如何用子选择解决这个问题,但是我需要一种更有效的方法

标签: sqloracle

解决方案


您可以使用:

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 全部的
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<>在这里摆弄


推荐阅读