oracle wm_concat函数简单实例(实现行转成用分隔符分隔的一列)

来源:互联网 发布:js 数组遍历运行不同步 编辑:程序博客网 时间:2024/05/16 00:51
主从表关联查询出从表某个字段的值用逗号连接起来

主表:故障单表 SP_PD_FAULT

从表:报障单表 SP_PD_FAULT_REPORT

目的:通过故障单关联查询出该故障单的报障单号,且用逗号分隔显示为一列


SELECT A.*, B.FAULT_NOS, B.FAULT_REPORT_IDS  FROM (SELECT *          FROM (SELECT DISTINCT (F.ID) F_ID,                                F.*,                                O.FAULT_OCCUR_TIME,                                O.FAULT_ADDRESS,                                O.FAULT_DESC                  FROM LCAM_SC.SP_PD_FAULT F,                       (SELECT A.FAULT_ID,                               A.FEEDER_ID,                               A.PROVINCE_CODE,                               A.FAULT_REPORT_STATUS,                               A.FAULT_REPORT_FROM,                               A.FAULT_REPORT_NO,                               A.FAULT_ADDRESS,                               A.FEEDER_NAME,                               A.FAULT_REPORT_STATUS,                               A.SUBSTATION_ID,                               A.SUBSTATION_NAME,                               A.ORGANIZATION_ID,                               A.TEAM_ID,                               A.BUREAU_CODE,                               A.CS_WORKORDER_NO,                               A.FAULT_DESC,                               A.FAULT_REPORTER,                               B.FAULT_OCCUR_TIME                          FROM LCAM_SC.SP_PD_FAULT_REPORT A,                               (SELECT FAULT_ID,                                       MIN(FAULT_OCCUR_TIME) FAULT_OCCUR_TIME                                  FROM LCAM_SC.SP_PD_FAULT_REPORT                                 GROUP BY FAULT_ID) B                         WHERE A.FAULT_ID = B.FAULT_ID                           AND (A.IS_MERGE = '1' OR A.IS_MERGE IS NULL)                           AND A.PROVINCE_CODE = '03'                           AND B.FAULT_OCCUR_TIME BETWEEN                               TO_DATE('2016-01-01 00:00',                                       'yyyy-mm-dd hh24:mi') AND                               (TO_DATE('2017-08-02 00:00',                                        'yyyy-mm-dd hh24:mi'))) O                 WHERE F.ID = O.FAULT_ID                   AND F.PROVINCE_CODE IS NOT NULL                   AND F.BUREAU_CODE IS NOT NULL                   AND O.PROVINCE_CODE = '03'                   AND F.FAULT_STATUS IN (2, 3, 4, 5, 6, 7)                   AND O.FAULT_OCCUR_TIME BETWEEN                       TO_DATE('2016-01-01 00:00', 'yyyy-mm-dd hh24:mi') AND                       TO_DATE('2017-08-02 00:00', 'yyyy-mm-dd hh24:mi'))) A,       (SELECT TO_CHAR(WM_CONCAT(FAULT_REPORT_NO)) FAULT_NOS,               TO_CHAR(WM_CONCAT(ID)) FAULT_REPORT_IDS,               FAULT_ID          FROM LCAM_SC.SP_PD_FAULT_REPORT         GROUP BY FAULT_ID) B WHERE A.ID = B.FAULT_ID(+)

从表使用GROUP BY外键字段,通过WM_CONCAT函数把报账单号和ID连接成一个字符串

       (SELECT TO_CHAR(WM_CONCAT(FAULT_REPORT_NO)) FAULT_NOS,
               TO_CHAR(WM_CONCAT(ID)) FAULT_REPORT_IDS,
               FAULT_ID
          FROM LCAM_SC.SP_PD_FAULT_REPORT
         GROUP BY FAULT_ID) B
 WHERE A.ID = B.FAULT_ID(+)


但是:报错 不存在的LOB值

出现这个错误很多时候是使用了wmsys.wm_concat的同时使用了group ,distinct 或者union,本来两者没有问题,问题在于:

1.Oracle Database 10g Enterprise Edition Release 10.2.0.5.0以后的版本wmsys.wm_concat查询出的是LOB类型

2.oralce的SQL语句中若查询了LOB字段是不能使用distinct,union,和group by等关键字的。


改成在把关联查询写成子查询


SELECT A.*,       (SELECT TO_CHAR(WM_CONCAT(FAULT_REPORT_NO))          FROM LCAM_SC.SP_PD_FAULT_REPORT B         WHERE A.ID = B.FAULT_ID) FAULT_NOS,       (SELECT TO_CHAR(WM_CONCAT(ID))          FROM LCAM_SC.SP_PD_FAULT_REPORT B         WHERE A.ID = B.FAULT_ID) FAULT_REPORT_IDS  FROM (SELECT DISTINCT (F.ID) F_ID,                                F.*,                                O.FAULT_OCCUR_TIME,                                O.FAULT_ADDRESS,                                O.FAULT_DESC                  FROM LCAM_SC.SP_PD_FAULT F,                       (SELECT A.FAULT_ID,                               A.FEEDER_ID,                               A.PROVINCE_CODE,                               A.FAULT_REPORT_STATUS,                               A.FAULT_REPORT_FROM,                               A.FAULT_REPORT_NO,                               A.FAULT_ADDRESS,                               A.FEEDER_NAME,                               A.FAULT_REPORT_STATUS,                               A.SUBSTATION_ID,                               A.SUBSTATION_NAME,                               A.ORGANIZATION_ID,                               A.TEAM_ID,                               A.BUREAU_CODE,                               A.CS_WORKORDER_NO,                               A.FAULT_DESC,                               A.FAULT_REPORTER,                               B.FAULT_OCCUR_TIME                          FROM LCAM_SC.SP_PD_FAULT_REPORT A,                               (SELECT FAULT_ID,                                       MIN(FAULT_OCCUR_TIME) FAULT_OCCUR_TIME                                  FROM LCAM_SC.SP_PD_FAULT_REPORT                                 GROUP BY FAULT_ID) B                         WHERE A.FAULT_ID = B.FAULT_ID                           AND (A.IS_MERGE = '1' OR A.IS_MERGE IS NULL)                           AND A.PROVINCE_CODE = '03'                           AND B.FAULT_OCCUR_TIME BETWEEN                               TO_DATE('2016-01-01 00:00',                                       'yyyy-mm-dd hh24:mi') AND                               (TO_DATE('2017-08-02 00:00',                                        'yyyy-mm-dd hh24:mi'))) O                 WHERE F.ID = O.FAULT_ID                   AND F.PROVINCE_CODE IS NOT NULL                   AND F.BUREAU_CODE IS NOT NULL                   AND O.PROVINCE_CODE = '03'                   AND F.FAULT_STATUS IN (2, 3, 4, 5, 6, 7)                   AND O.FAULT_OCCUR_TIME BETWEEN                       TO_DATE('2016-01-01 00:00', 'yyyy-mm-dd hh24:mi') AND                       TO_DATE('2017-08-02 00:00', 'yyyy-mm-dd hh24:mi')) A


外面包一层

SELECT A.*,
       (SELECT TO_CHAR(WM_CONCAT(FAULT_REPORT_NO))
          FROM LCAM_SC.SP_PD_FAULT_REPORT B
         WHERE A.ID = B.FAULT_ID) FAULT_NOS,
       (SELECT TO_CHAR(WM_CONCAT(ID))
          FROM LCAM_SC.SP_PD_FAULT_REPORT B
         WHERE A.ID = B.FAULT_ID) FAULT_REPORT_IDS
  FROM (

把需要的连接字符串使用子查询查出来





阅读全文
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 嘴巴里经常长泡怎么办 嘴唇上长透明泡怎么办 嘴唇上长很多泡怎么办 嘴巴里长白色泡怎么办 做了漂唇起泡了怎么办 漂唇之后起泡了怎么办 漂唇后起了水泡怎么办 嘴唇起泡,弄破了怎么办 九个月的宝宝上火了怎么办 8岁儿童嘴唇起泡怎么办 宝宝嘴皮上火起泡了怎么办 上嘴唇起泡肿了怎么办 上嘴唇突然肿了怎么办? 醒来上嘴唇肿了怎么办 嘴巴突然肿了怎么办呢 下嘴唇肿起来了怎么办 上嘴唇肿了起泡怎么办 上火下嘴唇肿了怎么办 上火嘴唇都肿了怎么办 嘴唇起泡后肿了怎么办 嘴唇上有白点颗粒状怎么办 嘴唇缺了一块红怎么办 人得钩端螺旋体怎么办 脖子上有鸡皮肤怎么办 不结婚老了以后怎么办 丁克族老了怎么办知乎 2个月宝宝咳嗽怎么办 干活累的手疼怎么办 脸上长白色的癣怎么办 全身起红斑很痒怎么办 宝宝脖子红烂了怎么办 背上长红斑很痒怎么办 身上起风疙瘩很痒怎么办 身上起小包很痒怎么办 浑身起红包很痒怎么办 手太粗糙怎么办小窍门 小腿长疙瘩很痒怎么办 腿过敏起红疙瘩怎么办 肚子上起红疙瘩很痒怎么办 小蚂蚁咬了肿了怎么办 锦鲤鱼尾巴烂了怎么办