假设我在SQL Server 2008 R2中有三个表
SELECT a.*, b.*, c.*
FROM
Table_A a
RIGHT JOIN Table_B b ON a.id = b.id
LEFT JOIN Table_C c ON b.id = c.id
或
SELECT a.*, b.*, c.*
FROM
Table_A a
RIGHT JOIN Table_B b ON a.id = b.id
JOIN Table_C c ON b.id = c.id
另外,如果我在加入c时使用b.id或a.id是否重要?
即。而不是JOIN Table_C c ON b.id = c.id
,请使用JOIN Table_C c ON a.id = c.id
谢谢!
答案 0 :(得分:1)
如果它不改变查询的语义,数据库服务器可以重新排序连接,以它认为更有效的方式运行。
通常,如果要强制执行某个订单,可以使用内联视图子查询,如
SELECT a.*, x.*
FROM
Table_A a
RIGHT JOIN
(
SELECT *, b.id as id2 FROM Table_B b
LEFT JOIN Table_C c ON b.id = c.id
) x
ON a.id = x.id2
答案 1 :(得分:1)
根据定义:
第一个选项将包括表a
和b
上的第一个连接中的所有原始数据,即使表c
中没有匹配的原始数据,而第二个语句仅显示原始数据与表c
中的匹配项。
关于第二个问题我想它会有所不同,因为第一个连接包括表ids
中的所有b
,即使表a
中没有匹配的连接,所以将Join creterium更改为a.id
后,您将获得一组不同于b.id
的ID。
答案 2 :(得分:1)
是的,你需要在RIGHT JOIN之后进行LEFT JOIN
见
http://sqlfiddle.com/#!3/2c079/5/0
http://sqlfiddle.com/#!3/2c079/6/0
如果你不这样做,那么最后的(内部)JOIN将取消你正确加入的效果。
如果你不在乎,那么在没有合适意义的情况下也没有任何意义。如果你在意,你将不得不在它之后添加LEFT JOIN。