INNER JOIN关联表过滤条件放ON或WHERE子句哪种更规范?
结论
对于你当前使用INNER JOIN的场景,两种写法的执行结果、性能(绝大多数数据库优化器都会生成完全一致的执行计划)没有任何差异,但从语义清晰度、可维护性、兼容性角度,更推荐将cat1.COMID = 12的筛选条件放在INNER JOIN的ON关联子句中。
具体原因
- 语义更匹配:
COMID是针对关联表ITEMCATEGORY的专属关联限制规则,你需要关联的本身就是COMID = 12的分类数据,把关联的全部匹配规则都放在ON子句中,其他人读代码时可以直接看懂两张表的关联逻辑,不需要到WHERE子句里拆分关联条件和单表筛选条件。 - 后续兼容性更强:如果之后需要把
INNER JOIN改成LEFT JOIN,两种写法的结果会出现本质差异:把COMID筛选放在WHERE子句时,LEFT JOIN会被隐式退化为和INNER JOIN效果一致,只有将筛选放在ON子句中才符合LEFT JOIN保留左表全部符合条件数据的预期。提前把关联表的专属筛选放在ON子句中,可以避免后续改联表类型时出现隐性bug。 - 逻辑分层更清晰:
WHERE子句仅保留主表MATERIAL的全局筛选条件prod.ISACTIVE = 1,逻辑拆分明确,维护成本更低。
如果你的团队有统一的SQL编码规范,要求所有筛选条件都放在WHERE子句中,优先对齐团队规范即可,除此之外优先选择ON子句放置关联表专属筛选的写法。
内容的提问来源于stack exchange,提问作者Faye D.
相关产品推荐
相关产品推荐

