多表重复数据排查:查询同时就读于多所学校的学生
查询同时就读于不同地点学校的学生列表
没问题,我来帮你搞定这个查询需求!根据你的表结构,核心就是找出那些同一个学生ID(毕竟重名但ID唯一,是区分不同学生的关键)关联了多个不同地点的学校的情况——因为每所学校对应唯一地点,所以只要学生对应的地点数超过1,就说明他违规就读多校了。
方法一:快速筛选出违规学生(仅ID和姓名)
这种方法用GROUP BY+HAVING就能快速定位到目标学生,适合只需要名单的场景:
SELECT s.StudentID, s.StudentName FROM Student s JOIN StudentSchool ss ON s.StudentID = ss.StudentID JOIN School sch ON ss.SchoolID = sch.SchoolID JOIN Location l ON sch.LocationID = l.LocationID GROUP BY s.StudentID, s.StudentName HAVING COUNT(DISTINCT l.LocationID) > 1;
逻辑说明:
- 把四张表关联起来,拿到每个学生对应的学校和所属地点信息
- 按学生ID和姓名分组(ID是唯一标识,姓名只是辅助展示)
- 通过
COUNT(DISTINCT l.LocationID) > 1筛选出关联了多个不同地点的学生
方法二:查看违规学生的具体就读信息
如果需要知道这些学生具体在哪几所不同地点的学校就读,可以用窗口函数来实现,能直观看到明细:
WITH StudentLocations AS ( SELECT s.StudentID, s.StudentName, sch.SchoolName, l.LocationName, -- 计算每个学生关联的不同地点数量 COUNT(DISTINCT l.LocationID) OVER (PARTITION BY s.StudentID) AS LocationCount FROM Student s JOIN StudentSchool ss ON s.StudentID = ss.StudentID JOIN School sch ON ss.SchoolID = sch.SchoolID JOIN Location l ON sch.LocationID = l.LocationID ) SELECT StudentID, StudentName, SchoolName, LocationName FROM StudentLocations WHERE LocationCount > 1 ORDER BY StudentID;
逻辑说明:
- 先用CTE(公共表表达式)计算出每个学生的所有就读记录,同时算出该学生关联的不同地点总数
- 筛选出地点总数大于1的记录,就能看到每个违规学生的具体就读学校和地点,方便后续核查修正
注意点
一定要以StudentID作为分组/分区的依据,不要只靠学生姓名——毕竟题目里明确说了学生可重名但为不同个体,姓名不能作为唯一标识哦!
内容的提问来源于stack exchange,提问作者Maro




