2013-12-11 84 views
0

我知道連接2個表。但是,當涉及到加入3個或更多表格時,我想到以下問題。這些可能看起來很基本,但如果有人解釋它會很棒。
涉及超過2個表連接的概念SQL JOIN問題

SELECT Customers.CustomerName, Orders.OrderID 
FROM Customers 
LEFT JOIN Orders ON Customers.CustomerID=Orders.CustomerID 
LEFT JOIN Regions ON Orders.RegionID = Regions.RegionID; 

問題1:
LEFT JOIN Regions ON Orders.RegionID = Regions.RegionID這是否加入出現在結果集的
注意我已經通過鏈接Understanding how JOIN works when 3 or more tables are involved. [SQL]

查詢的問題1 & 2不見了第一次加入?

問題2:如果什麼條件爲:
LEFT JOIN Regions ON Customers.RegionID = Regions.RegionID現在會發生什麼?這個連接發生在什麼結果集上?它是否發生在'客戶'結果集或第一個連接結果集上?

查詢問題3:

SELECT count(distinct Customers.CustomerName), count(Orders.OrderID), count(Regions.RegionID) 
FROM Customers 
LEFT JOIN Orders ON Customers.CustomerID=Orders.CustomerID 
LEFT JOIN Regions ON Orders.RegionID = Regions.RegionID; 

問題3:
會的結果而變化。如果加入順序將被逆轉嗎?在哪種情況下會有所不同?

查詢的問題4:

SELECT count(Regions.RegionID) 
FROM Customers 
LEFT JOIN Orders ON Customers.CustomerID=Orders.CustomerID 
LEFT JOIN Regions ON Orders.RegionID = Regions.RegionID; 

問題4:(這是我得到的最困惑)
當談到聚合,應該是什麼表名在FROM?它依賴於要彙總的table.column嗎? 對於問題的假設,假設2個連接是必需的,我們只需要計數(RegionID)。

+1

我認爲是這樣的:連接將首先創建一個包含所有組合的結果集(即Customers x訂單x地區)與所有表中的列。然後'ON' +'WHERE'過濾結果。 – adrianm

+0

根據定義,join * always *涉及多個表。沒有「連接單個表」(即使您使用同一個表兩次,仍然是兩個表的連接) –

+0

@adrianm想象一下,包含數百萬行的表。壞事,對吧?索引是魔術詞。在構建結果集之前進行過濾,然後通過WHERE過濾。 – fancyPants

回答

1

在我看來,你有三個表,與這些關係:訂單鏈接到客戶和地區,也是客戶鏈接到地區。

1)是的,它確實是 2)第二個查詢將客戶鏈接到區域,因此在您訂購區域之前(這可能會有所不同),這裏您有客戶區域。如果你願意,你可以在地區表上爲兩個客戶獲得一個客戶,另一個客戶爲訂單 3)使用左連接更改訂單時,結果可能會有所不同。例如在您的查詢中,您獲得了所有客戶(最終也是沒有訂單的客戶)以及可選的訂單和區域。如果您有類似「......來自區域左連接客戶......」的內容,您將擁有所有地區並最終獲得訂單。 4)計數會影響你的連接的結果,並可能涉及任何列,不僅僅是用於聚合的那一列