2013-05-07 74 views
1

我有這三張表。Oracle Cross加入

表1:

Resource1 
Resource2 
Resource3 

表2:

Period1 
Period2 
Period3 

表3:

Resource1 Period1 
Resource1 Period2 
Resource1 Period2 
Resource2 Period1 
Resource2 Period1 
Resource3 Period3 

我需要得到這樣的結果:

Resource1 Period1 
Resource1 Period2 
Resource1 Period2 
Resource1 Period3 
Resource2 Period1 
Resource2 Period1 
Resource2 Period2 
Resource2 Period3 
Resource3 Period3 
Resource3 Period1 
Resource3 Period2 

我嘗試了外連接,但沒有效果。我發現可能交叉連接應該有所幫助,但我沒有成功實施它。可能是一個如此善良的人,並幫助我這個東西?

非常感謝, r。

+1

你能解釋一下規則如何創建你的結果集嗎? 「不必要的行」是什麼意思? – 2013-05-07 08:15:30

+0

我很抱歉混淆。我現在將刪除關於描述中不必要的行的註釋。 規則是: 表1包含所有資源。表2包含系統中的所有開放時段。表3包含在某個特定時期做出某些事情的資源。 (可能有重複) 每個資源都需要提供與他的名字一起提及的所有開放時間段,並且如果他已經在表3中提到了無論多少次開放時間段,這些數據也必須在那裏。 所以結果:Table3中的重複項應該在那裏,當Table2中的某些開放時段丟失時,它們也應該在那裏)。 – roxor 2013-05-07 09:28:07

回答

1

使用公用表表達式生成的所有組合,然後使用一個外加入以包含table3中顯示的副本。

with cte as (select resource, period 
       from table1 cross join table2) 
select cte.resource 
     , cte.period 
from cte 
    left outer join table3 
      on (table3.resource = cte.resource 
      and table3.period = cte.period) 
; 

這可能不會產生正確的答案,這取決於你的意思是「我不知道如何擺脫不必要行」是什麼。您提供的輸出不會丟棄表中的任何行,並且您沒有提供任何規則。所以,如果這不能給你想要的東西,你必須編輯你的問題來澄清問題。

+0

你不一定需要一個CTE,但我認爲這個答案捕捉到了想要的結果。 – 2013-05-07 09:34:26

+1

@ypercube - 我同意WITH子句不是強制性的,但我喜歡他們,因爲他們可以幫助澄清查詢的結構。 – APC 2013-05-07 09:59:02

+0

它完全符合我的需求!現在我明白了爲什麼我的解決方案都很糟糕。我總是錯過了第二個條件:and table3.period = cte.period 非常感謝。 – roxor 2013-05-07 10:12:06

0

我得到你的結果,但我不知道我的想法是否正確或不..

SELECT A.RESOURCEID,B.PERIOD 
FROM 
TABLE1 A CROSS JOIN TABLE2 B 
UNION ALL 
SELECT RESOURCEID,PERIOD 
FROM TABLE3 C 
GROUP BY RESOURCEID,PERIOD 
HAVING COUNT(*)>1 

http://www.sqlfiddle.com/#!4/36667/2

+0

sqlfiddle.com很好,你分享這個 – roxor 2013-05-07 10:39:38

+0

@roxor年,真的很方便,我也從其他人那裏找到它:))。 – Gentlezerg 2013-05-07 14:27:47