1

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

谢谢!

4

3 回答 3

2

如果它不改变查询的语义,数据库服务器可以重新排序连接,使其以它认为更有效的方式运行。

通常,如果你想强制某个顺序,你可以使用内联视图子查询,如

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
于 2013-01-08T05:27:44.243 回答
1

根据定义:

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

第一个选项将包括来自 Tables 的第一个连接的所有原始数据ab即使 table 中没有匹配的c原始数据,而第二个语句将仅显示与 table 中的原始数据匹配的原始数据c

关于第二个问题,我想这会有所不同,因为第一个连接包括ids来自 table的所有内容b,即使 table 中没有匹配的a,所以一旦你将 Join creterium 更改为a.id你将得到一组不同的 id b.id

于 2013-01-08T05:34:17.233 回答
1

是的,在右连接之后确实需要左连接

http://sqlfiddle.com/#!3/2c079/5/0

http://sqlfiddle.com/#!3/2c079/6/0

如果你不这样做,最后的(内部)JOIN 将抵消你的 RIGHT JOIN 的效果。

如果您不在乎,那么进行 RIGHT JOIN 是没有任何意义的。如果你关心,你将不得不在它之后添加一个 LEFT JOIN。

于 2013-01-08T06:22:00.063 回答