You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle查询需求:获取指定用户关联的最高年级学生记录

Oracle跨库查询:仅展示最高年级学生详情的实现方案

原查询通过dblink_sme跨库获取指定用户关联的学生信息,但需求调整为仅返回年级(grade_level)最高的学生详情,以下是两种可行的Oracle实现方案:

方案一:使用窗口函数(推荐)

利用RANK()窗口函数对年级进行排序,筛选出排名第一的记录(支持多个学生同属最高年级的场景):

SELECT student_id, first_name, last_name, school_name, grade_level
FROM (
    SELECT DISTINCT 
        cfm.student_id,
        cfm.first_name,
        cfm.last_name,
        ss.school_name,
        se.grade_level,
        RANK() OVER (ORDER BY se.grade_level DESC) AS grade_rank
    FROM ce_family_member@dblink_sme cfm
    JOIN st_enrollment@dblink_sme se
        ON se.student_id = cfm.student_id
    JOIN sy_school@dblink_sme ss
        ON ss.school_id = se.school_id
    WHERE cfm.student_id IN (
        SELECT cfm.student_id
        FROM sec_user@dblink_sme su
        JOIN ce_house_head@dblink_sme chh
            ON chh.house_head_id = su.party_id
        JOIN ce_family_to_member@dblink_sme cfm
            ON cfm.family_id = chh.family_id
        WHERE su.login_name = 'johnmccormick@homerschools'
    )
) t
WHERE grade_rank = 1
ORDER BY first_name DESC, grade_level DESC;

如果需要严格去重(避免同年级同学生的重复记录),可将RANK()替换为ROW_NUMBER(),但注意ROW_NUMBER()会给同年级学生分配不同序号,仅保留一条(按内部排序规则)。

方案二:先获取最高年级再过滤

先查询符合条件学生中的最高年级值,再以此为条件筛选目标记录:

SELECT DISTINCT 
    cfm.student_id,
    cfm.first_name,
    cfm.last_name,
    ss.school_name,
    se.grade_level
FROM ce_family_member@dblink_sme cfm
JOIN st_enrollment@dblink_sme se
    ON se.student_id = cfm.student_id
JOIN sy_school@dblink_sme ss
    ON ss.school_id = se.school_id
WHERE cfm.student_id IN (
    SELECT cfm.student_id
    FROM sec_user@dblink_sme su
    JOIN ce_house_head@dblink_sme chh
        ON chh.house_head_id = su.party_id
    JOIN ce_family_to_member@dblink_sme cfm
        ON cfm.family_id = chh.family_id
    WHERE su.login_name = 'johnmccormick@homerschools'
)
AND se.grade_level = (
    SELECT MAX(se_inner.grade_level)
    FROM ce_family_member@dblink_sme cfm_inner
    JOIN st_enrollment@dblink_sme se_inner
        ON se_inner.student_id = cfm_inner.student_id
    WHERE cfm_inner.student_id IN (
        SELECT cfm.student_id
        FROM sec_user@dblink_sme su
        JOIN ce_house_head@dblink_sme chh
            ON chh.house_head_id = su.party_id
        JOIN ce_family_to_member@dblink_sme cfm
            ON cfm.family_id = chh.family_id
        WHERE su.login_name = 'johnmccormick@homerschools'
    )
)
ORDER BY first_name DESC, grade_level DESC;

此方案逻辑直观,但需要重复执行子查询,数据量较大时性能略逊于窗口函数方案。

内容的提问来源于stack exchange,提问作者Vishakh .K.V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:30:11