SQL如何筛选列A值相同且列C值不同的全字段记录
SQL查询实现方案
核心逻辑为先识别出所有存在多个不同C值的A分组,再返回这些分组下的全部原始行,完整保留四个字段。
方案1:窗口函数实现(支持MySQL 8.0+、PostgreSQL、SQL Server、Oracle等主流数据库)
SELECT A, B, C, D FROM ( SELECT *, COUNT(DISTINCT C) OVER (PARTITION BY A) AS distinct_c_count FROM 你的表名 ) tmp WHERE distinct_c_count > 1;
通过COUNT(DISTINCT C) OVER (PARTITION BY A)窗口函数,对每个A分组内的C去重计数,过滤掉计数为1的分组即可,不会丢失同分组下的任意行数据。
方案2:子查询关联实现(兼容低版本不支持窗口函数的数据库,如MySQL 5.x)
SELECT t1.A, t1.B, t1.C, t1.D FROM 你的表名 t1 INNER JOIN ( SELECT A FROM 你的表名 GROUP BY A HAVING COUNT(DISTINCT C) > 1 ) t2 ON t1.A = t2.A;
先通过子查询筛选出所有符合「同A下存在多个不同C」条件的A值,再关联原表获取这些A对应的全部行数据,执行效果和窗口函数方案完全一致。
示例运行结果
针对你提供的测试表,两种方案返回结果如下:
| A | B | C | D |
|---|---|---|---|
| a2 | b2 | c3 | d3 |
| a2 | b2 | c4 | d3 |
内容的提问来源于stack exchange,提问作者Francisco
相关产品推荐
相关产品推荐

