zoukankan      html  css  js  c++  java
  • wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换

     

     

    构建测试表:

    Sql代码
    1. create table TABLE1   
    2. (   
    3.   ID   INTEGER,   
    4.   NAME VARCHAR2(10)   
    5. )   
    6.   
    7. create table TABLE2   
    8. (   
    9.   ID   INTEGER,   
    10.   ROLE VARCHAR2(10)   
    11. )   
    12.   
    13. insert into TABLE1 (ID, NAMEvalues (1, '张三');   
    14. insert into TABLE1 (ID, NAMEvalues (2, '李四');   
    15. commit;   
    16.   
    17. insert into TABLE2 (ID, ROLE) values (1, '查询');   
    18. insert into TABLE2 (ID, ROLE) values (1, '分析');   
    19. insert into TABLE2 (ID, ROLE) values (1, '决策');   
    20. insert into TABLE2 (ID, ROLE) values (2, '查询');   
    21. commit;  

    要求输出结果:

    Sql代码
    1. ID  NAME    ROLE   
    2. 1    张三 查询,分析,决策   
    3. 2    李四 查询  

    方法一、使用wmsys.wm_concat

    Sql代码
    1. select table1.*,wmsys.wm_concat(role) from table1,table2 where table1.id=table2.id   
    2. group by table1.id,table1.name  

    方法二、使用sys_connect_by_path

    Sql代码
    1. select id, name, ltrim(max(sys_connect_by_path(role, ',')), ','from    
    2. (select row_number() over(partition by table1.id order by name) rn,table1.*, role from table1, table2  where table1.id =    
    3.   
    4. table2.id)   
    5. start with rn = 1   
    6. connect by prior rn = rn - 1 and prior id = id   
    7. group by id, name  
    8. order by id   
    9.          

    方法三、使用自定义函数 

    Sql代码
    1. create or replace function my_concat(mid in integerreturn varchar2       --记住:参数和返回值里的数据类型都不用定义长度   
    2. is  
    3. result varchar2(4000);    --定义变量,记住Oracle中定义变量不需要   
    4. begin  
    5.        for temp_cursor in (select role from table2 where id=mid) loop     --此处在游标FOR循环中使用查询   
    6.            result :=result || temp_cursor.role || ',';    --Oracle中字符连接使用||,而sql server中用+          
    7.        end loop;   
    8.        result := rtrim(result,',');  --去掉最后一个空格,还有Oracle中的赋值前面没有set   
    9.        return result;   
    10. end;   
    11.   
    12. select table1.*,my_concat(table1.id) from table1,table2 where table1.id=table2.id   
    13. group by table1.id,table1.name  
    14. order by table1.id  
  • 相关阅读:
    lvs+keepalived集群架构服务
    GlusterFS分布式存储系统
    Zabbix监控平台(三)生产环境案例
    Zabbix监控平台(二)深入了解
    Zabbix监控平台(一)搭建部署与概述
    Memcached数据库缓存
    Mariadb 基于Mycat实现读写分离
    基于mysqld_multi实现MySQL多实例配置
    tomcat-APR配置及三种工作模式简介
    Session服务器之Memcached与Redis
  • 原文地址:https://www.cnblogs.com/zhahost/p/1346706.html
Copyright © 2011-2022 走看看