我有3张桌子:
他们在这里:
DIM1表的示例:
-- 1 0 DIM1
---- 2 1 DIM1-A
------ 3 2 DIM1-A-A
-------- 4 3 DIM1-A-A-A
-------- 5 3 DIM1-A-A-B
------ 6 2 DIM1-A-B
-------- 7 6 DIM1-A-B-A
-------- 8 6 DIM1-A-B-B
------ 9 2 DIM1-A-C
---- 10 1 DIM1-B
------ 11 10 DIM1-B-C
------ 12 10 DIM1-B-D
---- 13 1 DIM1-C
DIM2表示例:
-- 1 0 DIM2
---- 2 1 DIM2-A
------ 3 2 DIM2-A-A
-------- 4 3 DIM2-A-A-A
-------- 5 3 DIM2-A-A-B
-------- 6 3 DIM2-A-B-C
------ 7 2 DIM2-A-B
---- 8 1 DIM2-B
---- 9 1 DIM2-C
FACTS表的示例:
1 1 100
1 2 30
1 3 500
-- ................
13 9 200
我想创建唯一 SELECT
,我将在其中指定DIM1的父级(例如,DIM1-A的ID1=2
)和DIM2的父级(用于DIM2-A的示例ID2=2
和SELECT
将生成如下报告:
Name_of_1 Name_of_2 Sum_of_X
--------- --------- ----------
DIM1-A-A DIM2-A-A (some sum)
DIM1-A-A DIM2-A-B (some sum)
DIM1-A-B DIM2-A-A (some sum)
DIM1-A-B DIM2-A-B (some sum)
DIM1-A-C DIM2-A-A (some sum)
DIM1-A-C DIM2-A-B (some sum)
我想使用CONNECT BY
词组,START WITH
词组,SUM
词组,GROUP BY
词组,OUTER
或INNER
(? )JOIN
。我不需要Oracle 10.2的其他扩展。
换句话说:只用“经典”SQL和
仅用于层次结构查询的Oracle扩展。
有可能吗?
我尝试了一些问题的实验 Mixing together Connect by, inner join and sum with Oracle
(这是一个非常好的解决方案,但仅适用于一个
维度表(“任务”),但我需要JOIN
两个维度表到一个事实表),但我没有成功。
答案 0 :(得分:2)
“一些总和”不是很具描述性,所以我不明白为什么你需要CONNECT BY
。
SELECT dim1.name, dim2.name, x
FROM (
SELECT id1, id2, SUM(x) AS x
FROM facts
GROUP BY
id1, id2
) f
JOIN dim1
ON dim1.id = f.id1
JOIN dim2
ON dim2.id = f.id2
答案 1 :(得分:0)
我认为您要做的是获取最高子项分组的指定行的所有子项的事实表中值的总和。这意味着在上面的示例中,第一行的结果将是(DIM1-AA,DIM1-AAA,DIM1-AAB)和(DIM2-AA,DIM2-AAA,DIM2-AAB,DIM3)的任何交叉点的总和。 -ACAC)在FACTS表中找到。有了这个假设,我得出了以下解决方案:
SELECT root_name1, root_name2, SUM(X)
FROM ( SELECT CONNECT_BY_ROOT(name1) AS root_name,
id1
FROM dim1
CONNECT BY parent1 = PRIOR id1
START WITH parent1 = 2) d1
CROSS JOIN
( SELECT CONNECT_BY_ROOT(name2) AS root_name,
id2
FROM dim2
CONNECT BY parent2 = PRIOR id2
START WITH parent2 = 2) d2
LEFT OUTER JOIN
facts
ON d1.id1 = facts.id1
AND d2.id2 = facts.id2
GROUP BY root_name1, root_name2
(这也假设FACTS的列名为ID1,ID2和X.)