sql - 如何进行分层 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:我知道如何用子选择解决这个问题,但是我需要一种更有效的方法
解决方案
您可以使用:
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<>在这里摆弄
推荐阅读
- istio - 为具有不同证书要求的 200 多个目标目的地配置出口流量的双向 TLS 发起
- java - 如何从java字符串中获取元素?
- karate - 如何根据空手道框架中的状态检查值
- vba - 写 txt 第一行而不是最后一行
- django - 如何通过 Django REST 向 RichTextUploadField 添加图像或音频文件上传支持?
- python - 如何使用列表理解进行转换?
- wpf - 如何在 WPF 中实现网格级别验证?
- xml - XML 节点的 XSD 验证可能很简单也可能很复杂
- c# - 如何将网格内容绑定到 UserControl
- javascript - 将赛普拉斯数据库查询输出对象放入变量中