• 技术文章 >数据库 >Oracle

    oracle怎么多行转一行

    长期闲置长期闲置2022-03-07 15:12:46原创761

    在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 LEVEL<4

    注:上面的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表数据如下

    ORGIDORGNAMEPID
    1000小学0
    1100一年级1000
    1200二年级1000
    1101101班1100
    1102102班1100
    1103103班1100
    1201201班1200

    1.LEVEL

    SELECT ORGNAME,LEVEL FROM ORGANIZATION 
    START WITH ORGID = 1000 CONNECT BY PRIOR O.ORGID = O.PID

    执行结果如下

    ORGNAMELEVEL
    小学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 LEVEL<4

    执行结果如下:
    小学,一年级,二年级,101班,102班,103班,201班

    推荐教程:《Oracle视频教程

    以上就是oracle怎么多行转一行的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:oracle
    上一篇:oracle怎么修改时区 下一篇:oracle怎么给表增加分区
    Web大前端开发直播班

    相关文章推荐

    • oracle怎么查询并赋值给变量• oracle数据库怎么修改字段• oracle怎么将日期转为字符串• oracle怎么关闭实例• oracle中not like的用法是什么

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网