2015-02-10 47 views
2

我在我們的一個數據庫中發現了一個視圖,該視圖在LEFT OUTER JOIN之後有多個ON語句。我不知道這是有效的TSQL,我甚至更疑惑它是什麼意思?與多個ON的加入意味着什麼?

+0

這意味着你要加入的滿足的不僅僅是一個條件 – Lamak 2015-02-10 13:03:56

+0

多個行的表你的意思是'連接表上COND1和COD2和cond3',而不是'連接表cond1上cond3上的cod2上,這將是無效 – 2015-02-10 13:04:25

+0

@juergend不是真的說'ON','.... LEFT OUTER JOIN Table3 t3 ON t3.Id = t2.Id ON t1.Type = t4.Type'。 – Peter 2015-02-10 13:08:32

回答

4

FROM強制連接順序中的ON子句。

如果在這樣

A LEFT JOIN B on A.id = B.id JOIN C on b.id = c.id 

表達你想要做B INNER JOIN首先C和OUTER JOIN然後,你可以使用括號

A LEFT JOIN (B JOIN C on b.id = c.id) on A.id = B.id 

括號不是必需的,你可以一個接一個地寫ON

A LEFT JOIN B JOIN C on b.id = c.id on A.id = B.id 

ON子句應該在兒科關係中(first-last,sec ond - 前一個等)

它就像2 + 2 * 2。如果預期結果爲8,則必須編寫(2 + 2) *2或使用逆波蘭表示法以避免含糊不清,2 2 + 2 *。圓括號更容易被人理解,但很少使用。當我在沒有括號的行中看到幾個ON時,通常它是自動生成的代碼。

2

每個JOIN只有一個ON類別。 當您加入一個表時,您可能會觀察到多個ON子句,並且後續的結果爲JOIN

在下面的代碼中選擇語句會給你相同的結果。

CREATE TABLE #Table1 
(
    ID int, 
    Name VARCHAR(50) 
) 

INSERT INTO #Table1 
VALUES 
(1, 'ABC'), 
(2, 'PQR') 

CREATE TABLE #Table2 
(
    ID int, 
    Address VARCHAR(50) 
) 

INSERT INTO #Table2 
VALUES 
(1, 'Addr1'), 
(2, 'Addr2') 


CREATE TABLE #Table3 
(
    ID int, 
    Dept VARCHAR(5) 
) 

INSERT INTO #Table3 
VALUES 
(1, 'Dept1'), 
(2, 'Dept2') 

SELECT T2.ID,T1.Name,T2.Address,T3.Dept 
FROM #Table1 T1 
LEFT JOIN #Table2 T2 ON T1.ID=T2.ID 
LEFT JOIN #Table3 T3 ON T1.ID=T3.ID 
SELECT T2.ID,T1.Name,T2.Address,T3.Dept 
FROM #Table1 T1 
LEFT JOIN #Table2 T2 
LEFT JOIN #Table3 T3 ON T2.ID=T3.ID ON T1.ID=T2.ID 
DROP TABLE #Table1,#Table2,#Table3 

注:在第二個SELECT語句,一個人不能代替ON T2.ID=T3.ID使用ON T1.ID=T3.ID。這是因爲,Table1不直接與Table2/Table3連接,而是與其連接的結果。

感謝,

Swapnil