我现在可能已经知道这一点,但什么,如果有的话是下面两个语句之间的区别?
嵌套连接:
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 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 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
所以基本上,你首先LEFT JOIN与T3 T2的基础上,加入条件:table3_ID = table2_ID,那么你的INNER JOIN与table2_ID = table1_ID T2 T1。
在第二个例子中,你首先INNER JOIN T1为T2,然后LEFT JOIN与条件table2_ID = table1_ID表T3所产生的内连接。
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 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中的元素的子集)作为LEFT所述第二查询执行较慢的性能差异联接将首先被执行 - 也只有那时与table1的相交。 相对于第二个查询,让查询优化器做的工作。
为了您的具体的例子,我不认为应该有生成的查询计划的任何差别,但有一定的可读性差。 你的第二个例子是更容易跟踪。
如果你是扭转加入本例中的类型,你可以用很多不同的结果结束。
SELECT t1.*
FROM table1 t1
LEFT JOIN table2 t2 ON t2.table2_ID = t1.table1_ID
INNER JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
-- may not produce the same results as...
SELECT t1.*
FROM table1 t1
LEFT JOIN table2 t2
INNER JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
ON t2.table2_ID = t1.table1_ID
在此基础上的连接顺序在许多情况下,无论是否事实 - 认真思考应该进入你写你怎么联接语法。 如果您发现第二个例子就是你真正想要实现,我会考虑重写查询,这样就可以把更多的强调你的加入顺序...
SELECT t1.*
FROM table2 t2
INNER JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
RIGHT JOIN table1 t1 ON t2.table2_ID = t1.table1_ID
看什么是这两个查询不同,最好的办法是比较的查询计划这两个查询。
没有这些,如果有总表3中列于表2给定的行中的结果集没有什么区别。
我试图在我的数据库和查询计划的区别是1.第一个查询,优化选择做对表2和表3中加入第一。 2.对于第二查询,优化选择了加盟Table 1和Table第一。
您应该看到没有区别这两个查询之间的一切,只要你的DBMS”优化是达到标准。 然而,这即使对于大铁,高性价比的平台,是不是一个假设,我会做出有信心,所以我会很感到意外地发现变化,查询计划(因而执行时间)。