2010-09-15 36 views
5

我不知道如何描述我的表結構,所以希望這是有道理的...如何做外部加入> 2表(甲板)

我有3個表中的層次關係,使A與B有一對多的關係,而B又有與C的一對多關係。技巧是允許B和C中的外鍵爲空(即沒有父定義)。我也有D和E,與A,B或C無關(直接)。

最後,我有F是一個與C,D和E具有多對一關係的連接表。它的任何字段(FK到其他表)都不可空。

我想編寫一個SQL語句,將單個結果集中的所有表連接起來。我知道我必須用戶外連接,因爲我希望所有的A與B和C.

問題一,無論它是否有B中的兒童和類似返回:我一直在尋找的ANSI外部聯接語法(我以前只使用Oracle「(+)」),並且找不到外部連接超過2個表的示例。有人可以提供/指出一個例子嗎?

問題二:是否可以根據連接表F包含來自表D和表E的記錄?如果是這樣,這是用外部連接完成的嗎?

謝謝!

編輯

當然,我張貼此之後,我發現,回答問題。然而,問題2仍然難倒我的例子。

例子:

  SELECT A.a, 
       B.b, 
       C.c 
      FROM A 
FULL OUTER JOIN B ON B.a = A.a 
FULL OUTER JOIN C ON C.b = B.b 
+0

你可能不想要FULL OUTER JOIN;它存在,但它很少使用(或有用)。 – 2010-09-15 21:00:37

+0

您尚未指定F中的哪些列與其他每個表加入 - 這意味着沒有人可以給出明確的答案。 – 2010-09-15 21:02:46

+0

您可以發表一些樣本數據和您想要的記錄集嗎? A,B和C都不是很有意義的名字。 – Quassnoi 2010-09-15 21:02:54

回答

0

爲了便於說明,大寫字母指向表,小寫字母指向主/外鍵列。我可能本應該寫成類似於Quassnoi,但會保持這種狀態,因爲這是它的開始。

此SQL返回我loooking的結果:

  SELECT A.a, 
       B.b, 
       C.c, 
       D.d, 
       E.e 
      FROM A 
FULL OUTER JOIN B ON B.a = A.a 
FULL OUTER JOIN C ON C.b = B.b 
FULL OUTER JOIN F ON F.c = C.c 
FULL OUTER JOIN D ON D.d = F.d 
FULL OUTER JOIN E ON E.e = F.e 

我試圖建立我的SQL像比爾但使用FULL加入,而不是左的,但它沒有返回相同的結果。礦。我不能說我完全理解他的SQL,但INNER連接過濾了一些結果。

1
select a.*, b.*, c.* 
from a 
left outer join b on a.b_id = b.id 
left outer join c on a.c_id = c.id 

現在,越來越d,E &的F那裏得到棘手:

select c.*, d.*, e.* 
from C 
inner join f on c.id = f.c_id 
inner join d on d.id = f.d_id 
inner join e on d.id = f.e_id 

然後我們把它放在一起:

select a.*, b.*, cde.* 
from a 
left outer join b on a.b_id = b.id 
left outer join 
(select c.id as c_id, c.*, d.*, e.* 
    from C 
    inner join f on c.id = f.c_id 
    inner join d on d.id = f.d_id 
    inner join e on d.id = f.e_id) CDE 
on a.c_id = cde.c_id 
+0

謝謝!我們必須同時發佈信息。 – sdoca 2010-09-15 20:57:57

0
SELECT a.*, b.*, c.*, d.*, e.* 
FROM a 
LEFT JOIN 
     b 
ON  b.a = a.id 
LEFT JOIN 
     с 
ON  c.b = b.id 
LEFT JOIN 
     f 
ON  f.с = c.id 
LEFT JOIN 
     d 
ON  d.id = f.d 
LEFT JOIN 
     e 
ON  e.id = f.e 
9

所以我想像你的模式是這樣的:

A --o< B --o< C --<F>-- D 
         >-- E 

你當然可以做多個連接,你也可以加入組用括號表情就像您可以將算術表達式。

SELECT ... 
FROM A LEFT OUTER JOIN (
    B LEFT OUTER JOIN (
    C LEFT OUTER JOIN (
     F INNER JOIN D ON D.d = F.d 
     INNER JOIN E ON E.e = F.e 
    ) ON C.c = F.c 
    ) ON B.b = C.b 
) ON A.a = B.a 

這些括號子查詢,他們只是在分組連接操作。

+2

這是「繪製」我的模式的好方法。謝謝!我需要花一些時間弄清楚你的select語句是否符合我的希望,但是我認爲我需要按照上面給喬納森的評論使用FULL連接。 – sdoca 2010-09-15 23:00:32