MySQL LEFT JOIN与UNION查询优化:车辆颜色数据合并方案问询
更优的SQL查询方案
首先得提个小细节:你当前用的UNION会自动对结果去重并排序,但你的期望结果里存在重复行(比如volvo的blue出现两次),所以UNION会把这两行合并成一行,其实不符合需求。换成UNION ALL才对——它不会做去重操作,还能省去排序去重的额外开销,性能更好。
针对你的需求,最简洁高效的优化写法是这样的:
SELECT c.id, c.name, c.color FROM car c UNION ALL SELECT c.id, c.name, ca.color FROM car c INNER JOIN car_alt ca ON c.id = ca.car_id;
我还修正了你原查询里的一个小笔误:原语句写的是car_alt.id_car,但你的表结构里是car_id,得改成ca.car_id才能正确关联。
为什么这个方案更优?
- 性能提升:
UNION ALL只是简单拼接两个结果集,不像UNION要做排序和去重,在数据量较大时差异会很明显。 - 逻辑清晰:明确区分了原始车辆颜色记录和关联的备选颜色记录,可读性更强。
如果你的数据库支持LATERAL(比如PostgreSQL、MySQL 8.0+),还可以试试另一种写法(不过对于你的简单场景,性能和UNION ALL差不多,只是写法不同):
SELECT c.id, c.name, col.color FROM car c LEFT JOIN LATERAL ( SELECT c.color AS color UNION ALL SELECT ca.color FROM car_alt ca WHERE ca.car_id = c.id ) col ON true;
但总的来说,UNION ALL的写法已经是最贴合你需求、最直观高效的方案了。
内容的提问来源于stack exchange,提问作者dompil
相关产品推荐
相关产品推荐

