请求修改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
相关产品推荐
相关产品推荐

