在SQL中连接多个表

Pri*_*nce 14 sql sql-server join

sombody解释我关于加入?

内连接根据条件选择公共数据.

左外连接选择左边的所有数据而不管是否共同,但从右表中获取公共数据,反之亦然,右外连接.

我知道基础知识,但在加入5,8,10个表时问题仍然存在.

假设我有10个表加入.如果我有前5个表的内连接,现在尝试对第6个表应用左连接,那么现在查询将如何工作?

我的意思是说现在前5个表的结果集将作为左表,第6个表将被视为右表?或者只有第五个表被视为左表,第六个表被视为右表?请帮我解决这个问题.

Mar*_*ith 20

当连接多个表时,每个连接的输出在逻辑上形成一个进入下一个连接的虚拟表.

因此,在您的问题的示例中,连接前5个表的复合结果将被视为左侧表.

有关详细信息,请参阅Itzik Ben-Gan的逻辑查询处理海报.

可以通过定位ON子句来控制联接中涉及的虚拟表.例如

SELECT *
FROM   T1
       INNER JOIN T2
         ON T2.C = T1.C
       INNER JOIN T3
                  LEFT JOIN T4
                    ON T4.C = T3.C
         ON T3.C = T2.C 
Run Code Online (Sandbox Code Playgroud)

相当于 (T1 Inner Join T2) Inner Join (T3 Left Join T4)

  • re"虚拟表...可以通过定位ON子句来控制"酷!所有常见的SQL方言都会观察到吗? (2认同)
  • @PieterGeerkens - 是的它是ANSI SQL.例如[Postgres Fiddle](http://www.sqlfiddle.com/#!1/c3de8/1)和[MySQL Fiddle](http://www.sqlfiddle.com/#!8/c3de8/3).虽然MySQL需要括号. (2认同)

Col*_*law 8

JOIN按顺序思考是有帮助的,所以前者是正确的.

SELECT *
  FROM a
  INNER JOIN b ON b.a = a.id
  INNER JOIN c ON c.b = b.id
  LEFT JOIN d ON d.c = c.id
  LEFT JOIN e ON e.d = d.id
Run Code Online (Sandbox Code Playgroud)

将来自各个领域a,并bc所有的ON条件都匹配,加上从值d的标准相匹配,其中加的所有内容e,所有的条件都匹配.

我知道这RIGHT JOIN是完全可以接受的,但我发现根据我的经验,这是不必要的 - 我几乎总是从左到右加入.