【问题标题】:SQL JOIN ConceptSQL 连接概念
【发布时间】:2018-05-16 11:29:56
【问题描述】:

最近我对 SQL JOIN 执行顺序感到非常困惑。假设我有 3 个这样的表: image

这是查询:

 SELECT * 
 FROM Table_a a 
 LEFT JOIN Table_b b ON a.id=b.id
 INNER JOIN table_c c ON b.id=c.id

你认为结果会是什么?根据我在几个网页上阅读的内容,顺序不会影响结果。

这就是我认为的结果是A left Join B,那么结果将是inner join with C。所以取决于A left join B的结果,将决定最终结果的结果。如果我错了,请纠正我

【问题讨论】:

  • 顺序无关紧要(尽管逻辑顺序更容易阅读)。在您的查询中,最终的内连接将左连接变成内连接。连接条件b.id=c.id 只能应用于非空值('something' = null => null)。
  • How does SQL join work?的可能重复

标签: sql join


【解决方案1】:

这个查询:

SELECT *
FROM Table_a a LEFT JOIN
     Table_b b
     ON a.id = b.id INNER JOIN
     Table_c c
     ON b.id = c.id;

相当于:

SELECT *
FROM Table_a a INNER JOIN
     Table_b b
     ON a.id = b.id INNER JOIN
     table_c c
     ON b.id = c.id;

嗯?这如何变成内部连接?好吧,首先现在 SQL 是从左到右解释的,所以你的查询被解释为:

SELECT *    
FROM (Table_a a LEFT JOIN
      Table_b b
      ON a.id = b.id
     ) INNER JOIN
     table_c c ON b.id = c.id;

也就是说,最后一个条件中的bleft join的结果。如果没有匹配,那么b.id 就是null 并且条件不成立。因此,这些行都被过滤掉了。

我建议在使用连接时遵循以下规则:

  • 将所有INNER JOINs 放在首位。
  • 对所有后续连接使用LEFT JOINs。
  • 不要使用RIGHT JOINs。

对我来说,这适用于 99.9% 的查询。在某些情况下,替代方法更可取——我通常使用子查询。

【讨论】:

  • HI Gordon,您能否详细说明一下为什么在这种情况下查询左连接与内连接等效?
  • 我更喜欢在单个查询中混合使用 LEFT JOINRIGHT JOIN,同时使用像 [SELECT][FROM] 这样的表名...
  • @Anthony.G 。 . .如果你想了解我的缩进风格,可以阅读Data Analysis Using SQL and Excel第一章。
猜你喜欢
  • 2012-01-15
  • 2012-02-06
  • 2015-05-26
  • 1970-01-01
  • 2018-06-20
  • 2017-12-14
  • 1970-01-01
  • 2016-08-30
  • 2021-12-29
相关资源
最近更新 更多