如何根据重复的ComputerCN字段获取对应的ComputerID列表?
获取重复ComputerCN对应的ComputerID列表
问题说明
你需要找出所有ComputerCN字段重复的记录对应的ComputerID,之前的分组查询仅能统计重复的ComputerCN数量,但无法直接返回对应ID;加入ComputerID到分组条件后,会因为ID的唯一性导致查询失效。
解决方案
以下是几种通用的实现方式:
方法一:子查询筛选重复的ComputerCN
先通过子查询找出所有存在重复的ComputerCN,再关联原表获取对应的ID:
SELECT ComputerID FROM Computer WHERE ComputerCN IN ( SELECT ComputerCN FROM Computer GROUP BY ComputerCN HAVING COUNT(*) > 1 );
方法二:窗口函数(适用于MySQL 8+、PostgreSQL、SQL Server等)
利用窗口函数直接计算每个ComputerCN的重复次数,再筛选出次数大于1的记录:
SELECT ComputerID FROM ( SELECT ComputerID, COUNT(*) OVER (PARTITION BY ComputerCN) AS duplicate_count FROM Computer ) AS temp WHERE duplicate_count > 1;
方法三:自连接匹配重复项
通过自连接找到相同ComputerCN但不同ComputerID的记录,再去重得到结果:
SELECT DISTINCT c1.ComputerID FROM Computer c1 JOIN Computer c2 ON c1.ComputerCN = c2.ComputerCN AND c1.ComputerID != c2.ComputerID;
为什么之前的查询无效?
当你把ComputerID加入GROUP BY子句后,分组逻辑变成了按ComputerCN+ComputerID的组合进行分组。由于ComputerID是唯一标识,每个分组只会包含一条记录,COUNT(*)的结果始终为1,因此HAVING COUNT(*) > 1无法匹配到任何数据。
内容的提问来源于stack exchange,提问作者Niek Jonkman
相关产品推荐
相关产品推荐

