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