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

SQL如何查询获取指定列值不重复的对应全部行数据

原有写法评估

你写的关联查询逻辑正确,可以输出预期结果,核心问题是需要对Color表做两次扫描:一次用于分组聚合统计每个颜色的出现次数,一次用于关联匹配取对应ID,数据量较大时执行效率偏低。另外子查询中不需要返回count(*)字段,仅返回name即可减少不必要的数据传输。

优化后的原有写法版本:

SELECT c3.id, c2.name AS Color
FROM (
    SELECT name
    FROM color 
    GROUP BY name
    HAVING count(*) = 1
) c2 INNER JOIN color c3 on c3.name = c2.name

最优实现方案

根据你使用的数据库版本,可以二选一:

1. 现代数据库(支持窗口函数:MySQL8.0+/PostgreSQL/SQL Server等)优先选窗口函数方案

仅需一次全表扫描即可完成计算,不需要表关联,执行效率最高,可读性更好:

SELECT id, name AS Color
FROM (
    SELECT 
        id,
        name,
        COUNT(*) OVER (PARTITION BY name) AS name_count
    FROM Color
) t
WHERE name_count = 1;

2. 旧版数据库(如MySQL5.x)选EXISTS子查询方案

如果给name字段建了索引,该方案性能远优于原有关联写法:

SELECT id, name AS Color
FROM Color c1
WHERE NOT EXISTS (
    SELECT 1 
    FROM Color c2 
    WHERE c2.name = c1.name AND c2.id != c1.id
);

内容的提问来源于stack exchange,提问作者TomuRain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:45:04