2010-09-10 28 views
2

我有3個表:CONNECT BY對於具有兩個兩個表JOINS

  • 兩次與分層結構
    (如遞歸類型的層次結構的 「尺寸」);
  • 一個帶有求和數據(如X列的「事實」)。

他們在這裏:

  1. DIM1(ID1,PARENT2,NAME1)
  2. DIM2(ID2,PARENT2,NAME2)
  3. FACTS(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表210

示例:FACTS表的

--  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 

實施例:

1 1 100 
1 2 30 
1 3 500 
-- ................ 
13 9 200 

我想創建唯一SELECT其中I將指定父爲DIM1(例如ID1=2用於DIM1-A)和DIM2的父代(例如ID2=2代表DIM2-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 WITHSUM詞組,短語GROUP BYOUTERINNER(?)JOIN。我不需要Oracle 10.2的其他擴展。換句話說:只有「經典」SQL和
只有Oracle擴展才能用於層次結構查詢。

可能嗎?

我嘗試了一些實驗用的問題在
Mixing together Connect by, inner join and sum with Oracle

(這裏是一個非常很好的解決方案但僅限於一個
維度表(「任務」),但我需要JOIN 維表到一個事實表),但我沒有成功。

回答

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 
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 

(這還假定事實的列被命名爲ID1,ID2,和X)