如何查询指定条件下某列值唯一的完整数据行?
获取某列值唯一的完整数据行解决方案
示例数据表
| col1 | col2 | col3 |
|---|---|---|
| value 1 | value 2 | value 3 |
| value 1 | value 2 | value 3 |
| value a | value b | value c |
| value a | value x | value c |
| value 1 | value b | value c |
问题分析
你现在用的SQL通过GROUP BY col2聚合后,只能返回分组的col2和计数,没法直接拿到完整的行数据。要获取整行,得先筛选出符合条件的col2值,再关联回原表,或者用窗口函数直接标记目标行。
解决方案
方法1:子查询筛选目标col2后关联原表
先找出col3='value c'且仅出现一次的col2值,再用这些值匹配原表拿到完整行:
SELECT t.* FROM the_table t WHERE t.col3 = 'value c' AND t.col2 IN ( SELECT col2 FROM the_table WHERE col3 = 'value c' GROUP BY col2 HAVING COUNT(col2) = 1 );
方法2:窗口函数(推荐,支持MySQL 8+、PostgreSQL、SQL Server等)
用COUNT() OVER()窗口函数计算每个col2在col3='value c'范围内的出现次数,直接筛选次数为1的行:
SELECT col1, col2, col3 FROM ( SELECT *, COUNT(col2) OVER (PARTITION BY col2) AS col2_count FROM the_table WHERE col3 = 'value c' ) AS sub WHERE col2_count = 1;
方法3:EXISTS子查询
通过EXISTS判断当前行的col2在col3='value c'的范围内是否只有唯一一行:
SELECT t1.* FROM the_table t1 WHERE t1.col3 = 'value c' AND NOT EXISTS ( SELECT 1 FROM the_table t2 WHERE t2.col3 = 'value c' AND t2.col2 = t1.col2 AND t2.col1 != t1.col1 -- 如果表有主键,用主键替换col1更准确 );
提示:如果表有主键(比如id列),优先用主键替代
col1,避免因col1值重复导致错误判断。
内容的提问来源于stack exchange,提问作者tiberiusz
相关产品推荐
相关产品推荐

