zoukankan      html  css  js  c++  java
  • 用wm_concat合并行及merge into更新

    已知需求:

    kmb结构:
    as_code varchar2(21),
    as_name varchar2(30)
    样例数据:(as_code列的编码是规则的,即3-3-3-3)
    as_code     as_name
    501         经费支出
    501001      商品服务支出
    501001001   办公费
    501001001001  其他杂项支出

    pzb结构:
    as_code varchar2(21),
    full_name varchar2(200)
    样例数据
    as_code               as_name
    501              
    501001
    501001001
    501001001001

    现编写sql实现如下功能:
    更新pzb的as_name列,使名称按全称显示即:
    as_code       full_name
    501           经费支出
    501001        经费支出-商品服务支出
    501001001     经费支出-商品服务支出-办公费
    501001001001  经费支出-商品服务支出-办公费-其他杂项支出

    --造表及数据
    create table kmb(
    as_code varchar2(21) CONSTRAINT kmb_pk PRIMARY KEY,
    as_name varchar2(30)) ;

    create table pzb(
    as_code varchar2(21) CONSTRAINT pzb_fk_kmb REFERENCES kmb(as_code),
    full_name varchar2(200));

    insert into kmb(as_code, as_name) values('501','经费支出');
    insert into kmb(as_code, as_name) values('501001','商品服务支出');
    insert into kmb(as_code, as_name) values('501001001','办公费');
    insert into kmb(as_code, as_name) values('501001001001','其他杂项支出');
    insert into pzb(as_code) select as_code from kmb;
    commit;

    SQL> select * from kmb;

    AS_CODE               AS_NAME
    --------------------- ------------------------------
    501                           经费支出
    501001                    商品服务支出
    501001001              办公费
    501001001001       其他杂项支出

    SQL> select * from pzb;

    AS_CODE               FULL_NAME
    --------------------- ------------------------------
    501                  
    501001               
    501001001            
    501001001001         

    --实现:oracle提供了一个函数wm_concat函数可以合并列,利用此函数将表kmb中同一个大类的as_name的不同列按顺序合并成一行,wm_concat默认连接字符为',',可用replace将其转换成'-'以符合需求,这样即可得出最细分类的串。最后按条件取结果集用merge into更新pzb表的full_name字段。脚本如下:
    SQL> merge into pzb p
      2  using (
      3  select p.as_code as_code, substr(a.wm, 1, instr(a.wm, '-', 1, length(p.as_code)/3)-1) full_name
      4         from kmb p,
      5   (select as_code, replace(wm, ',','-')||'-' wm from
      6     (select min(as_code) as_code, wm_concat(as_name) wm from kmb where 1=1 group by substr(as_code,1,3)))a
      7          where substr(p.as_code,1,3)=a.as_code)a
      8  on (p.as_code=a.as_code)
      9  when matched then
     10  update set full_name=a.full_name;
     
    SQL> commit;
    SQL> select * from pzb;

    AS_CODE                 FULL_NAME
    ---------------------     ------------------------------------------
    501                              经费支出
    501001                       经费支出-商品服务支出
    501001001                 经费支出-商品服务支出-办公费
    501001001001          经费支出-商品服务支出-办公费-其他杂项支出

             

                成长

           /      |     \

        学习   总结   分享

    QQ交流群:122230156

  • 相关阅读:
    敏捷开发-各个原则的理解
    DWH中增量数据的抽取
    SSIS的部署和配置
    Checkpoint 和Breakpoint
    两种动态SQL
    SQLServer查询计划
    程序员接项目的经验1
    Date.prototype.format
    前端颜色选择器
    Idea快捷键和使用技巧【未完】
  • 原文地址:https://www.cnblogs.com/benio/p/2158109.html
Copyright © 2011-2022 走看看