2

我有 3 张桌子:

  • 两个具有层次结构
    (如递归类型层次结构的“维度”);
  • 一个对数据求和(如 X 列的“事实”)。

他们在这里:

  1. DIM1 (ID1, PARENT2, NAME1)
  2. DIM2 (ID2, PARENT2, NAME2)
  3. 事实(ID1、ID2、X)

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)和 DIM2ID1=2父级(例如ID2=2DIM2-A)的地方,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词组和OUTERINNER(?)JOIN。我不需要 Oracle 10.2 的其他扩展。

换句话说:只有“经典”SQL 和
层次查询的 Oracle 扩展。

可能吗?

我在Mixing together Connect by, inner join and sum with Oracle中尝试了一些有问题的实验

(这是一个非常好的解决方案,但仅适用于一个
维度表(“任务”),但我需要将JOIN 两个维度表转换为一个事实表),但我没有成功。

4

2 回答 2

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
于 2010-09-10T19:36:28.660 回答
0

我认为您要做的是获取事实表中由最顶层子级分组的指定行的所有子级的值的总和。这意味着在上面的示例中,第一行的结果将是 (DIM1-AA, DIM1-AAA, DIM1-AAB) 和 (DIM2-AA, DIM2-AAA, DIM2-AAB, DIM3) 的任何交集的总和-AAC) 在 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。)

于 2010-09-10T21:05:26.357 回答