Oracle 11g如何在查询现有列上用wm_concat拼接同ID异CusCODE活跃CoID
问题原因
你当前的语句无法正常运行,是因为没有将Table_with_value作为主查询表关联,子查询无法直接引用未在当前查询作用域声明的表字段。
非PL/SQL实现方案(Oracle 11.1g适配,无需循环)
Oracle 11.1g支持内置拼接函数wm_concat,直接通过关联分组即可实现需求,语句如下:
SELECT v.CoID, NVL(wm_concat(DISTINCT s.CoID), 'N/A') AS active_CO_Status_for_same_ID_but_different_CusCODE, v.CusCODE, v.ID, v.Value FROM Table_with_value v LEFT JOIN Table_with_status s ON v.ID = s.ID AND v.CusCODE != s.CusCODE AND s.Co_status = 'active' GROUP BY v.CoID, v.CusCODE, v.ID, v.Value ORDER BY v.CoID;
逻辑说明
- 以
Table_with_value为基表左关联Table_with_status,关联条件直接过滤相同ID、不同CusCODE且状态为active的记录,避免后续where过滤丢失无匹配的行 wm_concat负责拼接符合条件的CoID,加DISTINCT是为了避免Table_with_status存在重复CoID时出现重复拼接值,无重复场景可以去掉NVL将无匹配记录的空值替换为N/A,完全符合预期输出要求- 按主表字段分组即可得到每条主表记录对应的拼接结果
兼容说明
如果你的环境禁用了非公开函数wm_concat,可以替换为SYS_CONNECT_BY_PATH的分层查询实现,逻辑一致性能满足300条以内的数据查询需求。
内容的提问来源于stack exchange,提问作者Matthew Zammit
相关产品推荐
相关产品推荐

