**:
為了方便大家學習和測試,所有的例子都是在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...