与多个 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
我在我们的一个数据库中发现一个视图在 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
.
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