查询中`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