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

请求修改PL/SQL块:输出ABC表中AGE重复记录的ID、Name、AGE列

修改PL/SQL代码输出重复AGE的ID、Name、AGE列

没问题,我来帮你调整这段代码,让它输出你需要的完整字段信息。原来的代码只获取了重复的AGE值,现在我们可以通过两种方式修改,都不用你提到的备选查询语句:

方案一:用窗口函数直接获取所有重复记录(推荐,性能更优)

这种方式通过子查询给每条记录标记对应AGE的出现次数,直接筛选出重复的记录,游标里就能拿到所有需要的字段:

DECLARE 
    CURSOR C_DUPLICATES IS 
        SELECT ID, Name, AGE
        FROM (
            SELECT ID, Name, AGE,
                   COUNT(*) OVER (PARTITION BY AGE) AS age_count
            FROM ABC
        )
        WHERE age_count > 1
        ORDER BY AGE, ID; -- 可选排序,方便按AGE分组查看重复记录
BEGIN 
    FOR rec IN C_DUPLICATES LOOP 
        DBMS_OUTPUT.PUT_LINE('ID: ' || rec.ID || ', Name: ' || rec.Name || ', AGE: ' || rec.AGE); 
    END LOOP;
END;
/

说明:

  • COUNT(*) OVER (PARTITION BY AGE) 会计算每个AGE分组下的记录总数,给每条记录带上这个计数
  • 外层筛选age_count > 1,就能得到所有属于重复AGE的记录
  • 循环里直接读取游标中的ID、Name、AGE字段拼接输出即可

方案二:保留原游标结构,嵌套查询获取详情

如果你想保留原来的游标逻辑(先找出重复的AGE值),可以在循环里嵌套查询,获取该AGE对应的所有记录:

DECLARE 
    CURSOR C_AGE IS 
        SELECT AGE FROM ABC GROUP BY AGE HAVING COUNT(1)>1 ;
BEGIN 
    FOR rec_age IN C_AGE LOOP 
        -- 针对当前重复的AGE,查询所有对应的记录
        FOR rec_details IN (SELECT ID, Name, AGE FROM ABC WHERE AGE = rec_age.AGE) LOOP
            DBMS_OUTPUT.PUT_LINE('ID: ' || rec_details.ID || ', Name: ' || rec_details.Name || ', AGE: ' || rec_details.AGE); 
        END LOOP;
    END LOOP;
END;
/

说明:

  • 原游标C_AGE不变,还是找出所有重复的AGE值
  • 外层循环拿到每个重复AGE后,内层循环查询该AGE对应的所有ID、Name、AGE并输出
  • 这种方式逻辑和你原来的代码更接近,但数据量大时性能不如方案一

两种方案都能满足你的需求,选哪种看你更偏好哪种代码结构~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:25:34