Oracle将多行数据转为一行的方法是什么
在oracle中,可以利用listagg函数配合“order by”子句实现多行转一行,该语句可以对数据进行排序,然后将排序的结果拼接起来,语法为“listagg (列名,‘分隔符’) within group(order by 列名)”。
本教程操作环境:Windows10系统、Oracle 11g版、Dell G3电脑。
oracle怎么多行转一行
由于需要,需要将获取到的机构组织下的子组织组成一行数据,使用到了Oracle自带的函数
listagg (列名,‘分隔符’) within group(order by 列名)
即在每个分组内,LISTAGG根据order by子句对列植进行排序,将排序后的结果拼接起来
我的组织结构是个树形结构,下面的SQL则是查询出当前部门下的所有子部门的名称。
SELECT LISTAGG(O.ORGNAME,',') WITHIN GROUP(ORDER BY LEVEL) FROM ORGANIZATION O START WITH O.ORGID = 1000 CONNECT BY PRIOR O.ORGID = O.PID AND LEVEL4
注:上面的SQL用到了Oracle的关键字LEVEL,它表示了树形结构中的数据在哪个层级
上面SQL还用到了Oracle树形查询语句START WITH … CONNECT BY PRIOR …
若查询的是该节点的所有父节点,则上面START WITH SQL应该改为:START WITH O.ORGID = 1000 CONNECT BY PRIOR O.PID = O.ORGID
(PRIOR后面的字段与先前的顺序不一样)
ORGANIZATION表数据如下
ORGID | ORGNAME | PID |
---|---|---|
1000 | 小学 | 0 |
1100 | 一年级 | 1000 |
1200 | 二年级 | 1000 |
1101 | 101班 | 1100 |
1102 | 102班 | 1100 |
1103 | 103班 | 1100 |
1201 | 201班 | 1200 |
1.LEVEL
SELECT ORGNAME,LEVEL FROM ORGANIZATION START WITH ORGID = 1000 CONNECT BY PRIOR O.ORGID = O.PID
执行结果如下
ORGNAME | LEVEL |
---|---|
小学 | 1 |
一年级 | 2 |
二年级 | 2 |
101班 | 3 |
102班 | 3 |
103班 | 3 |
201班 | 3 |
2.LISTAGG…WITHIN GROUP…
SELECT LISTAGG(O.ORGNAME,',') WITHIN GROUP(ORDER BY LEVEL) FROM ORGANIZATION O
执行结果如下:
小学,一年级,二年级,101班,102班,103班,201班
3.将父节点下的所有子节点拼成一行
SELECT LISTAGG(O.ORGNAME,',') WITHIN GROUP(ORDER BY LEVEL) FROM ORGANIZATION O START WITH O.ORGID = 1000 CONNECT BY PRIOR O.ORGID = O.PID AND LEVEL4
执行结果如下:
小学,一年级,二年级,101班,102班,103班,201班
以上就是关于“Oracle将多行数据转为一行的方法是什么”的相关知识,感谢各位的阅读,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注网络,小编每天都会为大家更新不同的知识。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Oracle将多行数据转为一行的方法是什么
本文地址: https://pptw.com/jishu/651311.html