You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多表重复数据排查:查询同时就读于多所学校的学生

查询同时就读于不同地点学校的学生列表

没问题,我来帮你搞定这个查询需求!根据你的表结构,核心就是找出那些同一个学生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;

逻辑说明:

  1. 把四张表关联起来,拿到每个学生对应的学校和所属地点信息
  2. 按学生ID和姓名分组(ID是唯一标识,姓名只是辅助展示)
  3. 通过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;

逻辑说明:

  1. 先用CTE(公共表表达式)计算出每个学生的所有就读记录,同时算出该学生关联的不同地点总数
  2. 筛选出地点总数大于1的记录,就能看到每个违规学生的具体就读学校和地点,方便后续核查修正

注意点

一定要以StudentID作为分组/分区的依据,不要只靠学生姓名——毕竟题目里明确说了学生可重名但为不同个体,姓名不能作为唯一标识哦!

内容的提问来源于stack exchange,提问作者Maro

火山引擎 最新活动