日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 操作树大全,oracle树查询语句

發布時間:2024/4/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 操作树大全,oracle树查询语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

oracle樹查詢語句

2020-01-13 01:01:01 79

格式:

SELECT column

FROM table_name

START WITH column=value

CONNECT BY PRIOR 父主鍵=子外鍵

select lpad(' ',4*(level-1))||name name,job,id,super from emp

start with super is null

connect by prior id=super

例子:

原始數據:select no,q from a_example2

NO NAME

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

001 a01

001 a02

001 a03

001 a04

001 a05

002 b01

003 c01

003 c02

004 d01

005 e01

005 e02

005 e03

005 e04

005 e05

需要實現得到結果是:

001 a01;a02;a03

002 b01

003 c01;c02

004 d01

005 e01;e02;e03;e04;e05

思路:

1、ORACLE8.1之后有個connect by 子句,取出整棵樹數據。

create table a_example1

(

no char(3) not null,

name varchar2(10) not null,

parent char(3)

)

insert into a_example1

values('001','老王',null)

insert into a_example1

values('101','老李',null)

insert into a_example1

values('002','大王1','001')

insert into a_example1

values('102','大李1','101')

insert into a_example1

values('003','大王2','001')

insert into a_example1

values('103','大李2','101')

insert into a_example1

values('003','小王1','002')

insert into a_example1

values('103','小李1','102')

NO  NAME PARENT

001 老王

101 老李

002 大王1 001

102 大李1 101

003 大王2 001

103 大李2 101

003 小王1 002

103 小李1 102

//按照家族樹取數據

select * from a_example1

select level,sys_connect_by_path(name,'/') path

from a_example1

start with /*name = '老王' and*/ parent is null

connect by parent = prior no

結果:

1 /老王

2 /老王/大王1

3 /老王/大王1/小王1

2 /老王/大王2

1 /老李

2 /老李/大李1

3 /老李/大李1/小李1

2 /老李/大李2

按照上面思路,我們只要將原始數據做成如下結構:

NO NAME

001 a01

001 a01/a02

001 a01/a02/a03

001 a01/a02/a03/a04

001 a01/a02/a03/a04/a05

002 b01

003 c01

003 c01/c02

004 d01

005 e01

005 e01/e02

005 e01/e02/e03

005 e01/e02/e03/e04

005 e01/e02/e03/e04/e05

最后按NO分組,取最大的一個值即為所需的結果。

NO NAME

001 a01/a02/a03/a04/a05

002 b01

003 c01/c02

004 d01

005 e01/e02/e03/e04/e05

SQL語句:

select no,max(sys_connect_by_path(name,';')) result from

(select no,name,rn,lead(rn) over(partition by no order by rn) rn1

from (select no,name,row_number() over(order by no,name desc) rn from a_example2)

)

start with rn1 is null connect by rn1 = prior rn

group by no

語句分析:

1、 select no,name,row_number() over(order by no,name desc) rn from a_example2

按照NO升序排序,同時按照NAME降序排序,產生偽列,目的是要形成樹結構

NO  NAME RN

001 a03 1

001 a02 2

001 a01 3

002 b01 4

003 c02 5

003 c01 6

004 d01 7

005 e05 8

005 e04 9

005 e03 10

005 e02 11

005 e01 12

2、select no,name,rn,lead(rn) over(partition by no order by rn) rn1

from ( select no,name,row_number() over(order by no,name desc) rn from a_example2)

生成家族譜,即子節點與父節點有對應關系,對應關系通過rn和 rn1。其中lead為上一條記錄的RN值

NO  NAME RN  RN1  001 a03 1 2 --

說明:針對NO=001來說,其下一條記錄的RN=2 001 a02 2 3 --說明:針對NO=001來說,其下一條記錄的RN=3 001 a01 3  --說明:針對NO=001來說,其下一條記錄的RN IS NULL

002 b01 4 003 c02 5 6 003 c01 6 004 d01 7 005 e05 8 9 005 e04 9 10 005 e03 10 11 005 e02 11 12 005 e01 12

3、select no,sys_connect_by_path(name,';') result from

(select no,name,rn,lead(rn) over(partition by no order by rn) rn1

from ( select no,name,row_number() over(order by no,name desc) rn from a_example2))

start with rn1 is null connect by rn1 = prior rn

正式生成樹

NO   RESULT

001 ;a01

001 ;a01;a02

001 ;a01;a02;a03

002 ;b01

005 ;e01

005 ;e01;e02

005 ;e01;e02;e03

005 ;e01;e02;e03;e04

005 ;e01;e02;e03;e04;e05

003 ;c01

003 ;c01;c02

004 ;d01

將上面結果按照NO分組,取result最大值即可,所以將上述語句改為

select no,max(sys_connect_by_path(name,';')) result from

(select no,name,rn,lead(rn) over(partition by no order by rn) rn1

from (select no,name,row_number() over(order by no,name desc) rn from a_example2)

)

start with rn1 is null connect by rn1 = prior rn

group by no

得到所需結果。

總結

以上是生活随笔為你收集整理的oracle 操作树大全,oracle树查询语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。