Oracle高階查詢之CONNECT BY

2021-07-12 02:59:34 字數 2665 閱讀 3781

**:

為了方便大家學習和測試,所有的例子都是在oracle自帶使用者scott下建立的。

oracle中的select語句可以用start with ... connect by prior ...子句實現遞迴查詢,connect by 是結構化查詢中用到的,其基本語法是:

select ... from 

where 《過濾條件,用於對返回的所有記錄進行過濾》

start with 《根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹》

connect by [prior] 《連線條件,其中用prior表示上一條記錄,比如:connect by prior t.id = t.parent_id就是說上一條記錄的id 是本條記錄的parent_id,即本記錄的父親是上一條記錄》 

下面我們直接來看例項,查詢'king'的所有下屬雇員。sql語句如下:

[sql]view plain

copy

select

*  from

scott.emp e  

start with

e.ename = 

'king'

connect

byprior

e.empno = e.mgr;  

我們再來看另外乙個例項,反過來查詢'smith'的所有上司。sql語句如下:

[sql]view plain

copy

select

*  from

scott.emp e  

start with

e.ename = 

'smith'

connect

bye.empno = 

prior

e.mgr;  

通過上面的兩個例項,估計大家應該理解的差不多了,接下來介紹connect by的幾個固定搭檔。

1、sys_connect_by_path函式

語法:sys_connect_by_path(列名, '分隔符')。

作用:從start with的地方開始遍歷,將遍歷到的路徑根據函式中的分隔符,組成乙個新的字串。

[sql]view plain

copy

select

sys_connect_by_path(ename, 

'/') ename_tree  

from

scott.emp  

start with

ename = 

'king'

connect

bymgr = 

prior

empno;  

[sql]view plain

copy

select

max(ltrim(sys_connect_by_path(column_name, 

'|'), 

'|')) column_names  

from

(select

column_name, rownum rnum  

from

user_tab_columns  

where

table_name = 

'emp'

)  start with

rnum = 1  

connect

byrnum = rownum;  

2、level:在結構化查詢結果中,每一行都是結構中的乙個節點,level表示該節點在結構中的層次,根節點為1,根節點的子節點為2,以此類推。

下面sql語句很直觀的展示效果:

[sql]view plain

copy

select

ename, sys_connect_by_path(ename, 

'/') ename_tree, 

level

from

scott.emp  

start with

ename = 

'king'

connect

bymgr = 

prior

empno;  

3、connect_by_root:用在列名之前,返回當前節點的根節點對應列的值。connect_by_isleaf:返回當前節點是否為葉子節點,「是」返回1,「否」返回0。

下面sql語句很直觀的展示效果:

[sql]view plain

copy

select

sys_connect_by_path(ename, 

'/') ename_tree,  

connect_by_root ename as

root,  

connect_by_isleaf as

isleaf  

from

scott.emp e  

start with

e.ename = 

'king'

connect

byprior

e.empno = e.mgr;  

Oracle高階查詢之GROUP BY

為了方便大家學習和測試,所有的例子都是在oracle自帶使用者scott下建立的。現在客戶的需求是統計部門中每種工作的工資總額,最後還需要統計所有人的工資總數,相信這樣的需求對大家來說還是比較簡單的,很快就能寫出sql語句,如下 sql view plain copy select deptno,j...

Oracle高階查詢之GROUP BY

對於group by 的方式不再累贅,高階方式如下案例。為了方便大家學習和測試,所有的例子都是在oracle自帶使用者scott下建立的。所用emp表,如果沒有此表請參考文章 中拷貝 現在客戶的需求是統計部門中每種工作的工資總額,最後還需要統計所有人的工資總數,相信這樣的需求對大家來說還是比較簡單的...

oracle高階查詢之相關子查詢

在子查詢中一般先執行子查詢,在執行住查詢,但是相關子查詢列外 相關子查詢就是把主查詢的值作為引數傳遞給子查詢 例子 找到員工表中薪水大於平均薪水員工 方法一 select empno,ename,sal,select g sal from emp where deptno e.deptno gsal...