在正确加入后我是否必须进行LEFT JOIN?

时间:2013-01-08 05:22:32

标签: sql sql-server-2008 join outer-join

假设我在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

谢谢!

3 个答案:

答案 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)

根据定义:

  • JOIN :当两个表中至少有一个匹配时返回行
  • LEFT JOIN 返回左表中的所有行,即使右表中没有匹配项
  • RIGHT JOIN 返回右表中的所有行,即使左表中没有匹配项

第一个选项将包括表ab上的第一个连接中的所有原始数据,即使表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。