完成多表Join SQL查询,寻求代码优化建议与替代写法
四表关联SQL查询的优化技巧与替代实现方式
优化技巧
- 把关联条件移至
ON子句:将原本放在WHERE里的表关联逻辑,放到INNER JOIN的ON参数后,让查询语义更清晰,也能帮助数据库优化器生成更高效的执行计划 - 仅查询必要字段:避免使用
SELECT *,明确指定需要的supplier_name、part_price等字段,减少数据传输量与内存开销 - 给关联字段加索引:在
supply表的supplier_id、part_id,以及car表的关联外键字段上创建索引,能显著提升多表关联的查询速度 - 移除不必要的表关联:确认
car表是否真的参与了筛选或输出,如果业务逻辑不需要它,直接剔除该表关联,降低查询复杂度 - 坚持显式
JOIN写法:用INNER JOIN table ON ...替代FROM table1, table2 WHERE ...的隐式关联写法,代码可读性与可维护性更强
其他可行实现方式
子查询嵌套写法
通过子查询先筛选出符合条件的供货记录,再关联供应商和零件表获取目标字段:
SELECT s.supplier_name, p.part_price FROM supplier s JOIN part p ON s.supplier_id = p.supplier_id WHERE EXISTS ( SELECT 1 FROM supply sp JOIN car c ON sp.car_id = c.car_id WHERE sp.supplier_id = s.supplier_id AND sp.part_id = p.part_id -- 此处添加你的业务筛选条件 );
CTE(公共表表达式)写法
将复杂的关联逻辑拆分为可复用的CTE,提升代码可读性:
WITH filtered_supply AS ( SELECT sp.supplier_id, sp.part_id FROM supply sp JOIN car c ON sp.car_id = c.car_id -- 此处添加你的业务筛选条件 ) SELECT s.supplier_name, p.part_price FROM supplier s JOIN part p ON s.supplier_id = p.supplier_id JOIN filtered_supply fs ON s.supplier_id = fs.supplier_id AND p.part_id = fs.part_id;
LEFT JOIN 适配场景(按需使用)
如果需要保留供应商/零件的记录(即使无对应供货或车辆关联),可改用LEFT JOIN后再筛选:
SELECT s.supplier_name, p.part_price FROM supplier s LEFT JOIN part p ON s.supplier_id = p.supplier_id LEFT JOIN supply sp ON p.part_id = sp.part_id LEFT JOIN car c ON sp.car_id = c.car_id WHERE c.car_id IS NOT NULL -- 筛选出有对应车辆的记录 -- 此处添加你的业务筛选条件 ;
内容的提问来源于stack exchange,提问作者Janio Carvalho
相关产品推荐
相关产品推荐

