Reputation: 49
i have the following data:
structure:
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 |
values:
id | value |
---|---|
1.1.1 | 10 |
1.1.1 | 15 |
1.1.2 | 5 |
2.1.1 | 20 |
2.2.1 | 10 |
i want to bring the following result:
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 |
i need a oracle query to bring me this result, any idea how to do this?
PS: i know how to solve this problem with subselect, however i need a more efficient way
Upvotes: 1
Views: 48
Reputation: 167822
You can use:
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
Which, for the sample data:
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;
Outputs:
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<>fiddle here
Upvotes: 3