2013-04-13 79 views
13

是否可以向我解釋關於連接的內容?加入SQL中的多個表格

內部連接根據條件選擇公共數據。

LEFT OUTER JOIN選擇所有的數據從左邊不論是共同但有右表和右外反之亦然需要共同的數據。

我知道的基本知識,但問題保持當談到加入比5,8,10桌。

假設我有10個表加入。如果我有第一個5個表的內連接,現在嘗試應用第六個表的左連接,現在查詢將如何工作?

我的意思是說現在的結果集前5代表將被視爲左表和第六屆一個將considerded爲右表?或者只有第五張桌子被認爲是左邊和第六張?請幫助我解決這個問題。

+1

[SQL加入的可視化表示](http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html) –

+0

@JohnWoo這篇文章是由它的repuditated作者在評論中。維恩圖並未說明一般連接與其輸入的關係。 – philipxy

回答

17

當連接多個表時,每個連接的輸出在邏輯上形成一個虛擬表,進入下一個連接。

所以,在你的問題的例子加盟前5桌的複合結果將被視爲左手錶。

有關更多信息,請參見Itzik Ben-Gan's Logical Query Processing Poster

參與的虛擬表的連接可以通過定位ON子句來控制。例如

SELECT * 
FROM T1 
     INNER JOIN T2 
     ON T2.C = T1.C 
     INNER JOIN T3 
        LEFT JOIN T4 
        ON T4.C = T3.C 
     ON T3.C = T2.C 

相當於(T1 Inner Join T2) Inner Join (T3 Left Join T4)

+2

re「可以通過定位ON子句來控制虛擬表格」Cool!所有常見的SQL方言都觀察到了嗎? –

+2

@PieterGeerkens - 是的,它是ANSI SQL。例如[Postgres小提琴](http://www.sqlfiddle.com/#!1/c3de8/1)和[MySQL小提琴](http://www.sqlfiddle.com/#!8/c3de8/3)。儘管MySQL需要括號。 –

5

這是想在序列JOIN的幫助,所以前者是正確的。

SELECT * 
    FROM a 
    INNER JOIN b ON b.a = a.id 
    INNER JOIN c ON c.b = b.id 
    LEFT JOIN d ON d.c = c.id 
    LEFT JOIN e ON e.d = d.id 

會從abc,所有的ON標準匹配的所有字段,再加上從d其中其標準匹配值加e所有的條件都匹配的所有內容。

我知道RIGHT JOIN是完全可以接受的,但我已經在我的經驗中發現,這是不必要的 - 我幾乎總是剛剛從左至右加盟的事情。

1

>簡單的INNER JOIN VIEW代碼...

CREATE VIEW room_view 
AS SELECT a.*,b.* 
FROM j4_booking a INNER JOIN j4_scheduling b 
on a.room_id = b.room_id; 
0

您可以申請加入這樣的..

select a.*,b.*,c.*,d.*,e.* 
from [DatabaseName].[Table_a] a 
INNER JOIN [DatabaseName].[Table_b] b ON a.id = b.id 
INNER JOIN [DatabaseName].[Table_c] c ON b.id=c.id 
INNER JOIN [DatabaseName].[Table_d] d on c.id=d.id 
INNER JOIN [DatabaseName].[Table_e] e on d.id=e.id where a.con=5 and 
b.con=6 

這裏,在地方的。*和在狀態,你可以顯示你喜歡的列(提交),並根據條件在哪裏條件。您可以根據您的選擇插入更多表格和數據庫。但是請記住,如果您在不同的數據庫中工作,則需要提及數據庫名稱和別名。