本教程操作环境: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 ostart 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
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
执行结果如下
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 ostart with o.orgid = 1000 connect by prior o.orgid = o.pid and level<4
执行结果如下:
小学,一年级,二年级,101班,102班,103班,201班
推荐教程:《oracle视频教程》
以上就是oracle怎么多行转一行的详细内容。