日期:2014-05-16 浏览次数:20407 次
--合并行的示例代码
--示例1
select id,name
from (
select id,name,row_number() over(partition by id order by piece desc) as piece
from (
select id,replace(sys_connect_by_path(name,';'),';','') as name,piece
from (
select id,name,piece as child,piece-1 as father,piece
from (
select 1 as id,'我是' as name,1 as piece from dual
union all
select 1 as id,'中国' as name,2 as piece from dual
union all
select 1 as id,'人' as name,3 as piece from dual
) t1
) t2
start with father=0
connect by prior child=father
) t3
) t
where piece=1通过sys_connect_by_path实现行的合并,通过上述代码,可举一反三,实现生成树的路径,另外,实现行的合并可使用decode函数,也可以自定义函数实现,这里只是抛砖引玉介绍sys_connect_by_path函数的方法。
注:
1.自Oracle 9i 开始,就可以通过 SYS_CONNECT_BY_PATH 函数实现将从父节点到当前行内容以“path”或者层次元素列表的形式显示出来;
--代码见顶部的示例1
示例2
select id,child,father,connect_by_isleaf
from (
select id,name,piece as child,piece-1 as father,piece
from (
select 1 as id,'我是' as name,1 as piece from dual
union all
select 1 as id,'中国' as name,2 as piece from dual
union all
select 1 as id,'人' as name,3 as piece from dual
) t1
) t2
start with father=0
connect by prior child=father--示例3
select connect_by_root name,id,name,child,father,piece,replace(sys_connect_by_path(name,';'),';','') as name
from (
select id,name,piece as child,piece-1 as father,piece
from (
select 1 as id,'我是' as name,1 as piece from dual
union all
select 1 as id,'中国' as name,2 as piece from dual
union all
select 1 as id,'人' as name,3 as piece from dual
) t1
) t2
start with father=0
connect by prior child=father;
--注意:connect_by_root后必须跟上要显示的选择列,比如我这里让它显示的是name字段
--注:上述3个函数必须带上start with和connect by prior关键字