如何编写SQL查询提取同一学号对应多个不同姓名的记录
问题说明
现有Student表包含Roll No.(学号)、Name(姓名)两个字段,部分相同学号的记录对应了不同的姓名,需要筛选出这类学号。
示例表数据如下:
| Roll No. | Name |
|---|---|
| 1 | A |
| 1 | A |
| 2 | B |
| 2 | C |
| 2 | D |
| 3 | E |
| 3 | E |
| 4 | F |
| 5 | G |
| 6 | H |
| 6 | I |
筛选规则:
- 同一学号对应多个不同姓名的才纳入结果,比如学号2对应B/C/D、学号6对应H/I符合要求
- 同一学号有多条记录但姓名完全一致的不纳入,比如学号1、3不符合要求
- 最终预期输出学号为2、6
实现SQL
核心思路是按学号分组后,统计每组去重后的姓名数量,大于1的就是符合要求的学号:
SELECT `Roll No.` FROM Student GROUP BY `Roll No.` HAVING COUNT(DISTINCT `Name`) > 1;
语句说明
- 用
GROUP BYRoll No.`` 把所有记录按学号分组 - 用
COUNT(DISTINCTName)统计每个学号下不重复的姓名数量,避免同姓名多条重复记录干扰统计结果 - 用
HAVING子句过滤出不重复姓名数大于1的分组,也就是对应多个不同姓名的学号
内容的提问来源于stack exchange,提问作者Anandhu
相关产品推荐
相关产品推荐

