You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:27:20