多表INNER JOIN时加WHERE条件报错,如何正确设置连接条件?
解决多表INNER JOIN中插入WHERE子句的语法错误
错误原因
SQL语法规则明确要求:WHERE子句必须放在所有JOIN操作的末尾,不能穿插在两个JOIN语句之间。你当前的写法把WHERE table2.column1 = 'horse'放在了table2和table3的JOIN之间,破坏了语句结构,导致语法报错。
两种可行的修正方案
方案1:将所有过滤条件移至语句末尾的WHERE子句
把针对各表的过滤条件统一放在最后,用AND连接,符合SQL语句结构规范:
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id INNER JOIN table3 ON table2.id = table3.id WHERE table2.column1 = 'horse' AND table3.column1 = 'cow';
方案2:将过滤条件合并到对应JOIN的ON子句
把针对每个关联表的过滤条件,用AND追加到该表的JOIN连接条件后,更直观地体现“仅关联符合条件的记录”:
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id AND table2.column1 = 'horse' INNER JOIN table3 ON table2.id = table3.id AND table3.column1 = 'cow';
补充说明
对于INNER JOIN,上述两种写法的执行结果和性能完全一致,数据库优化器通常会生成相同的执行计划。如果使用LEFT JOIN,两种写法会有逻辑差异(条件放ON会保留左表全部记录,放WHERE会过滤掉左表中不满足条件的记录),但你当前场景用的是INNER JOIN,可根据个人习惯选择任意一种。
内容的提问来源于stack exchange,提问作者craftdeer
相关产品推荐
相关产品推荐

