与多个 ON 的连接是什么意思?

What does a join with multiple ON's mean?

我在我们的一个数据库中发现一个视图在 LEFT OUTER JOIN 之后有多个 ON 语句。我不知道这是有效的 TSQL,我对它的含义更加困惑?

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 子句应具有交叉关系(第一个-最后一个,第二个-最后​​一个等等)

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

每个 JOIN 只有一个 ON 子句。 当您将 Table 与后续 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

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

谢谢,

Swapnil