如何在不分组的情况下查询Power与Price重复的SQL行?
查找Power和Price重复的所有记录(保留全列)
下面提供几种实用的SQL写法,都能满足你保留所有列、不分组的需求:
方法1:窗口函数(推荐)
用窗口函数直接统计每个Power+Price组合的行数,再筛选出重复的组:
SELECT id, Power, Price, Name FROM ( SELECT *, COUNT(*) OVER (PARTITION BY Power, Price) AS row_count FROM your_table_name -- 替换成你的实际表名 ) temp WHERE row_count > 1;
内层查询通过PARTITION BY Power, Price把相同Power和Price的行归为一组,计算每组的总行数;外层只保留行数大于1的行,就能拿到所有重复的记录,主键id和其他列都完整保留。
方法2:EXISTS子查询
通过子查询检查当前行是否存在其他行有相同的Power和Price:
SELECT id, Power, Price, Name FROM your_table_name t1 WHERE EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.Power = t1.Power AND t2.Price = t1.Price AND t2.id != t1.id -- 排除自身匹配 );
对每一行t1,只要能找到另一行t2(id不同但Power、Price相同),就把t1纳入结果,逻辑直观易懂。
方法3:自连接
把表和自身连接,匹配Power、Price相同但id不同的行,再去重:
SELECT DISTINCT t1.id, t1.Power, t1.Price, t1.Name FROM your_table_name t1 JOIN your_table_name t2 ON t1.Power = t2.Power AND t1.Price = t2.Price AND t1.id != t2.id;
自连接后会产生双向匹配(比如id=1和id=4互相匹配),所以用DISTINCT避免重复输出同一行。
用以上任意一种方法查询你提供的示例数据表,都会得到你期望的结果:
+----+-------+-------+--------+ | id | Power | Price | Name | +----+-------+-------+--------+ | 1 | 300W | $5.00 | Alpha | | 4 | 300W | $5.00 | Charlie| +----+-------+-------+--------+
内容的提问来源于stack exchange,提问作者Strill
相关产品推荐
相关产品推荐

