查询中`INNER JOIN`过滤条件的位置; `ON`或`WHERE`子句

在这个问题上有一个答案涉及到这个..但我觉得它值得一个问题是它自己的。

这个问题被标记为与第一个重复,但不是真正的问题,这是我想问的问题。正如它在以下内容中所说:

这个问题之前已经被问过了,而且已经有了答案。 如果这些答案没有完全解决您的问题,请提出一个新问题

所以我在问一个新问题。

我可以写一个查询为:

SELECT *
  FROM customer_order co
  JOIN customer c 
    ON c.id = co.customer_id
   AND c.type = 'special'
  JOIN order o
    ON o.id = co.order_id
   AND o.status = 'dispatched'

要么:

SELECT *
  FROM customer_order co
  JOIN customer c 
    ON c.id = co.customer_id
  JOIN order o
    ON o.id = co.order_id
 WHERE c.type = 'special'
   AND o.status = 'dispatched'

我绝对喜欢第一种方式,特别是在更复杂的查询中,因为它将条件与它们所在的表进行分组,这使我更容易阅读并识别适当的组合索引。 这也意味着如果我想改变为LEFT JOIN (或者可能是RIGHT JOIN ,我并不真正使用RIGHT JOIN ),所有的条件都在正确的位置。

然而,社区似乎有一些倾向于第二种方式。

有没有人知道这种偏好是否基于,也许在某些性能问题或某些可读性问题上,我还没有碰到? 还是我可以继续幸福地成为一名叛逆者?


他们都完全一样。 唯一的决定因素是您在项目中使用的标准。 你需要决定什么更容易阅读,并遵循这一点。 例如,你设计查询的方式并不是我想要的。

我会做

SELECT 
  *
FROM 
  customer_order co

  INNER JOIN customer c ON 
    c.id = co.customer_id AND 
    c.type = 'special'

  INNER JOIN order o ON 
    o.id = co.order_id AND 
    o.status = 'dispatched'

除了我觉得我的可读性更强以外,我和你的没有区别。 作为一个经验法则,我通常保留与基表相关的语句的where子句。 此外,内部联接中的第一列将与正在联接的表(egoid或c.id)相关。 这些都是我用来保持一致性的所有东西。 另一个开发人员可能更喜欢在where子句中包含所有条件。 这只是偏好

关于你对社区的想法,我认为大多数人会同意一致性是关键。 确保你为其他开发人员记录你的方法,并与之相符。 如果表现受到影响,这将是一个不同的讨论,但事实并非如此。

继续你在做什么,但要确保它是一致的!

此外,对于这样的问题,我认为代码审查论坛是一个更好的地方,家伙将不太可能投下你的问题。


在内部连接的情况下,它们在执行中确实是等价的,即使存在不同的语义。 查询优化器将审查和评估WHERE子句和FROM子句中的条件,并在构建查询计划时考虑所有这些因素,以便达到最高效的执行计划。 所以你可以用任何你喜欢的方式去。

同样如你所说,值得注意的是,当内部连接被左/右连接方程改变时,你需要'ON'子句中的过滤器。

链接地址: http://www.djcxy.com/p/86261.html

上一篇: Position of `INNER JOIN` filtering conditions in a query; `ON` or `WHERE` clause

下一篇: SQL left join vs multiple tables on FROM line?