SYS_CONNECT_BY_PATH函数用法 ORACLE _MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1958 | 回复: 1   主题: SYS_CONNECT_BY_PATH函数用法 ORACLE         下一篇 
gunrose
注册用户
等级:新兵
经验:36
发帖:79
精华:0
注册:2011-7-21
状态:离线
发送短消息息给gunrose 加好友    发送短消息息给gunrose 发消息
发表于: IP:您无权察看 2015-12-15 11:29:51 | [全部帖] [楼主帖] 楼主

SELECT ename   
FROM scott.emp    
START WITH ename = 'KING'    
CONNECT BY PRIOR empno = mgr;

 
--得到结果为:  
 

KING   
JONES   
SCOTT   
ADAMS   
FORD   
SMITH   
BLAKE   
ALLEN   
WARD   
MARTIN   
TURNER   
JAMES

 
 
而:  
 

SELECT SYS_CONNECT_BY_PATH(ename, '>') "Path"    
FROM scott.emp    
START WITH ename = 'KING'    
CONNECT BY PRIOR empno = mgr;

 
--得到结果为:  
 

>KING   
>KING>JONES   
>KING>JONES>SCOTT   
>KING>JONES>SCOTT>ADAMS   
>KING>JONES>FORD   
>KING>JONES>FORD>SMITH   
>KING>BLAKE   
>KING>BLAKE>ALLEN   
>KING>BLAKE>WARD   
>KING>BLAKE>MARTIN   
>KING>BLAKE>TURNER   
>KING>BLAKE>JAMES   
>KING>CLARK   
>KING>CLARK>MILLER


其实SYS_CONNECT_BY_PATH这个函数是oracle9i才新提出来的。
它一定要和connect by子句合用。
第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符。

START WITH 代表你要开始遍历的的节点。

CONNECT BY PRIOR 是标示父子关系的对应。

如下例子:

view plaincopy to clipboardprint?
select max(   
substr(   
sys_connect_by_path(column_name,',')   
,2)   
)   
from (select column_name,rownum rn from user_tab_columns where table_name ='AA_TEST')   
start with rn=1 connect by rn=rownum ;  
select max(
substr(
sys_connect_by_path(column_name,',')
,2)
)
from (select column_name,rownum rn from user_tab_columns where table_name ='AA_TEST')
start with rn=1 connect by rn=rownum ;


是将列用,进行分割成为一行,然后将首个,去掉,只取取最大的那个数据。

---------------------------------------------

下面是别人的例子:

1、带层次关系

view plaincopy to clipboardprint?
SQL> create table dept(deptno number,deptname varchar2(20),mgrno number);   
  
Table created.   
  
SQL> insert into dept values(1,'总公司',null);   
  
1 row created.   
  
SQL> insert into dept values(2,'浙江分公司',1);   
  
1 row created.   
  
SQL> insert into dept values(3,'杭州分公司',2);   
  
1 row created.   
  
SQL> commit;   
  
Commit complete.   
  
SQL> select max(substr(sys_connect_by_path(deptname,','),2)) from dept connect by prior deptno=mgrno;   
  
MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))   
--------------------------------------------------------------------------------   
总公司,浙江分公司,杭州分公司

SQL> create table dept(deptno number,deptname varchar2(20),mgrno number);
Table created.
SQL> insert into dept values(1,'总公司',null);
1 row created.
SQL> insert into dept values(2,'浙江分公司',1);
1 row created.
SQL> insert into dept values(3,'杭州分公司',2);
1 row created.
SQL> commit;
Commit complete.
SQL> select max(substr(sys_connect_by_path(deptname,','),2)) from dept connect by prior deptno=mgrno;
MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))--------------------------------------------------------------------------------
总公司,浙江分公司,杭州分公司


2、行列转换


如把一个表的所有列连成一行,用逗号分隔:

view plaincopy to clipboardprint?
SQL> select max(substr(sys_connect_by_path(column_name,','),2))   
from (select column_name,rownum rn from user_tab_columns where table_name ='DEPT')   
start with rn=1 connect by rn=rownum ;   
  
MAX(SUBSTR(SYS_CONNECT_BY_PATH(COLUMN_NAME,','),2))   
--------------------------------------------------------------------------------   
DEPTNO,DEPTNAME,MGRNO



 




--转自



赞(0)    操作        顶端 
火树银花
注册用户
等级:中士
经验:245
发帖:2
精华:0
注册:2016-1-8
状态:离线
发送短消息息给火树银花 加好友    发送短消息息给火树银花 发消息
发表于: IP:您无权察看 2016-3-28 19:53:46 | [全部帖] [楼主帖] 2  楼

ok



赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论