CONNECT BY两个表有两个JOINS

时间:2010-09-10 19:29:42

标签: oracle hierarchical aggregate

我有3张桌子:

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

他们在这里:

  1. DIM1(ID1,PARENT2,NAME1)
  2. DIM2(ID2,PARENT2,NAME2)
  3. 事实(ID1,ID2,X)
  4. 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=2SELECT将生成如下报告:

    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 两个维度表到一个事实表),但我没有成功。

2 个答案:

答案 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.)