Teh*_*One 6 sql t-sql database sql-server join
我现在应该知道这一点,但是,如果下面两个陈述之间有什么区别呢?
嵌套连接:
SELECT
t1.*
FROM
table1 t1
INNER JOIN table2 t2
LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
ON t2.table2_ID = t1.table1_ID
Run Code Online (Sandbox Code Playgroud)
更传统的加入:
SELECT
t1.*
FROM
table1 t1
INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID
LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
Run Code Online (Sandbox Code Playgroud)
嗯,这是操作的顺序..
SELECT
t1.*
FROM
table1 t1
INNER JOIN table2 t2
LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
ON t2.table2_ID = t1.table1_ID
Run Code Online (Sandbox Code Playgroud)
可以改写为:
SELECT
t1.*
FROM
table1 t1 -- inner join t1
INNER JOIN
(table2 t2 LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID) -- with this
ON t2.table2_ID = t1.table1_ID -- on this condition
Run Code Online (Sandbox Code Playgroud)
所以基本上,你首先LEFT JOIN与T3 T2的基础上,加入条件:table3_ID = table2_ID,那么你的INNER JOIN与table2_ID = table1_ID T2 T1.
在第二个示例中,首先使用t2 INNER JOIN t1,然后在条件table2_ID = table1_ID上使用表t3 LEFT JOIN生成的内部联接.
SELECT
t1.*
FROM
table1 t1
INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID
LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
Run Code Online (Sandbox Code Playgroud)
可以改写为:
SELECT
t1.*
FROM
(table1 t1 INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID) -- first inner join
LEFT JOIN -- then left join
table3 t3 ON t3.table3_ID = t2.table2_ID -- the result with this
Run Code Online (Sandbox Code Playgroud)
编辑
我道歉.我的第一句话是错的.两个查询将产生相同的结果,但有可能在作为第一查询可能比在某些情况下(当表1仅包含表2中的元素的子集)作为LEFT所述第二查询执行较慢的性能差异联接将首先执行 - 然后才与table1相交.与允许查询优化器完成它的第二个查询相反.