我可能现在应该知道这一点,但是以下两个语句之间的区别是什么?
嵌套联接:
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
比较传统的联接:
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
好吧,这是操作的顺序。
可以改写为:
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
因此,基本上,首先根据连接条件:t3将t2与t3左连接,然后在table2_ID = table1_ID上与t2对IN1进行t1内连接。
在第二个示例中,首先将INNER JOIN t1与t2组合在一起,然后在条件table2_ID = table1_ID上与表t3进行左联接。
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
编辑
我道歉。我的第一句话是错误的。这两个查询将产生相同的结果,但是在性能上可能会有所不同,因为在某些情况下(当表1仅包含表2中元素的子集时),第一个查询的执行可能会比第二个查询慢。首先执行-然后才与table1相交。与第二个查询相反,第二个查询允许查询优化器完成其工作。