`

wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换

阅读更多

构建测试表:

create table TABLE1
(
  ID   INTEGER,
  NAME VARCHAR2(10)
)

create table TABLE2
(
  ID   INTEGER,
  ROLE VARCHAR2(10)
)

insert into TABLE1 (ID, NAME) values (1, '张三');
insert into TABLE1 (ID, NAME) values (2, '李四');
commit;

insert into TABLE2 (ID, ROLE) values (1, '查询');
insert into TABLE2 (ID, ROLE) values (1, '分析');
insert into TABLE2 (ID, ROLE) values (1, '决策');
insert into TABLE2 (ID, ROLE) values (2, '查询');
commit;

 

要求输出结果:

ID	NAME	ROLE
1	 张三	查询,分析,决策
2	 李四	查询

 

 

方法一、使用wmsys.wm_concat

select table1.*,wmsys.wm_concat(role) from table1,table2 where table1.id=table2.id
group by table1.id,table1.name

 

方法二、使用sys_connect_by_path

select id, name, ltrim(max(sys_connect_by_path(role, ',')), ',') from 
(select row_number() over(partition by table1.id order by name) rn,table1.*, role from table1, table2  where table1.id = 

table2.id)
start with rn = 1
connect by prior rn = rn - 1 and prior id = id
group by id, name
order by id
       

 

方法三、使用自定义函数 

create or replace function my_concat(mid in integer) return varchar2       --记住:参数和返回值里的数据类型都不用定义长度
is
result varchar2(4000);    --定义变量,记住Oracle中定义变量不需要
begin
       for temp_cursor in (select role from table2 where id=mid) loop     --此处在游标FOR循环中使用查询
           result :=result || temp_cursor.role || ',';    --Oracle中字符连接使用||,而sql server中用+       
       end loop;
       result := rtrim(result,',');  --去掉最后一个空格,还有Oracle中的赋值前面没有set
       return result;
end;

select table1.*,my_concat(table1.id) from table1,table2 where table1.id=table2.id
group by table1.id,table1.name
order by table1.id

 

 

分享到:
评论

相关推荐

    oracle列合并的实现方法

    很多场合我们都会用到...sys_connect_by_path(字段名, 2个字段之间的连接符号),这里的连接符号不要使用逗号,oracle会报错,如果一定要用,可以使用replace替换一下,方法如下 REPLACE(字段名,原字符,’,’)。这个

    oracle10g,9i多行合并一行函数

    这里介绍一种使用`sys_connect_by_path()`函数结合`connect by`语法的方法。 **示例代码:** ```sql SELECT name, MAX(REPLACE(SUBSTR(sys_connect_by_path(course, '*'), 2), '*', ';')) AS courses FROM ( ...

    oracle多行转为字符串总结

    介绍了将多行转为字符串的三种方案,并比较了三种方案的执行效率. 1.sys_connect_by_path + start with ... connect by ... prior + 分析函数 2.自定义Function/SP 3.使用 Oracle 10g 内置函数 wmsys.wm_concat

    通过SQL语句实现行列转换的几种方法

    而当您需要确保结果字符串的排序准确无误时,`SYS_CONNECT_BY_PATH` 和 `CONNECT BY PRIOR` 可能是最可靠的选择。 总之,了解各种方法的特点及其适用场景可以帮助您做出最佳决策,从而高效地完成行列转换任务。

    Oracle+SQL精妙SQL语句讲解.txt

    之后使用`SYS_CONNECT_BY_PATH`函数,通过递归的方式将每个节点下的`ROLE`列值按照指定的分隔符(此处为逗号)进行连接。 以上是对给定文档中几个主要知识点的总结与解释,希望能帮助你更好地理解和掌握这些Oracle ...

    SQL精妙语句讲解(Oracle)

    `SYS_CONNECT_BY_PATH` 函数可以用来生成层次结构的数据: ```sql SELECT ID, NAME, LTRIM(MAX(SYS_CONNECT_BY_PATH(ROLE, ',')), ',') FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY TABLE1.ID ORDER BY NAME)...

    SQL最佳实践

    - **SYS_CONNECT_BY_PATH()**:用于构建层次路径。 - **ORDER SIBLINGS BY**:按照指定顺序排列同级节点。 - **The NOCYCLE**:防止查询进入无限循环。 通过遵循以上SQL最佳实践,可以显著提高数据库应用的性能和可...

Global site tag (gtag.js) - Google Analytics