连接多个ON是什么意思?

时间:2015-02-10 13:03:20

标签: sql-server tsql

我在其中一个数据库中找到了一个视图,该视图在ON之后有多个LEFT OUTER JOIN语句。我不知道这是有效的TSQL,我对这意味着什么更加困惑?

2 个答案:

答案 0 :(得分: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

不需要括号,你可以一个接一个地写

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

ON条款应该是儿科关系(第一个,第二个 - 最后一个等)

就像2 + 2 * 2。如果预期结果为8,则必须编写(2 + 2) *2或使用反向波兰表示法以避免歧义,2 2 + 2 *。括号更容易被人理解,但很少使用。当我在没有括号的情况下连续看到几个ON时,通常它是自动生成的代码。

答案 1 :(得分:2)

每个ON只有一个JOIN个问题。 当您使用后续JOIN的结果加入表时,您可能会观察到多个ON子句。

以下代码中的Select语句将给出相同的结果。

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

注意:在第二个选择语句中,不能使用ON T1.ID=T3.ID代替ON T2.ID=T3.ID。这是因为,Table1没有与Table2 / Table3直接连接,而是与它们的连接结果。

谢谢,

Swapnil