connect by與where條件執行順序問題
-----------層次查詢中查詢條件在connect by後執行
文件:
《SQL REFERENCE》
SELECT/hierarchical_query_clause
The hierarchical_query_clause lets you select rows in a hierarchical order.
SELECT statements that contain hierarchical queries can contain the LEVEL pseudocolumn in the select list. LEVEL returns the value 1 for a root node, 2 for a child node of a root node, 3 for a grandchild, and so on. The number of levels returned by a hierarchical query may be limited by available user memory.
Oracle processes hierarchical queries as follows:
(1)A join, if present, is evaluated first, whether the join is specified in the FROM clause or with WHERE clause predicates.
(2)The CONNECT BY condition is evaluated.
(3)Any remaining WHERE clause predicates are evaluated.
If you specify this clause, then do not specify either ORDER BY or GROUP BY, because they will destroy the hierarchical order of the CONNECT BY results. If you want to order rows of siblings of the same parent, then use the ORDER SIBLINGS BY clause.
舉例:
--無查詢條件
select rownum,ename,sys_connect_by_path(ename,'/') from scott.emp
start with mgr is null
connect by prior empno=mgr;
ROWNUM ENAME SYS_CONNECT_BY_PATH(ENAME,'/')
1 KING /KING
2 JONES /KING/JONES
3 SCOTT /KING/JONES/SCOTT
4 ADAMS /KING/JONES/SCOTT/ADAMS
5 FORD /KING/JONES/FORD
6 SMITH /KING/JONES/FORD/SMITH
7 BLAKE /KING/BLAKE
8 ALLEN /KING/BLAKE/ALLEN
9 WARD /KING/BLAKE/WARD
10 MARTIN /KING/BLAKE/MARTIN
11 TURNER /KING/BLAKE/TURNER
12 JAMES /KING/BLAKE/JAMES
13 CLARK /KING/CLARK
14 MILLER /KING/CLARK/MILLER
--查詢條件在connect by後執行
select rownum,ename,sys_connect_by_path(ename,'/') from scott.emp
where ename<>'KING'
start with mgr is null
connect by prior empno=mgr;
ROWNUM ENAME SYS_CONNECT_BY_PATH(ENAME,'/')
1 JONES /KING/JONES
2 SCOTT /KING/JONES/SCOTT
3 ADAMS /KING/JONES/SCOTT/ADAMS
4 FORD /KING/JONES/FORD
5 SMITH /KING/JONES/FORD/SMITH
6 BLAKE /KING/BLAKE
7 ALLEN /KING/BLAKE/ALLEN
8 WARD /KING/BLAKE/WARD
9 MARTIN /KING/BLAKE/MARTIN
10 TURNER /KING/BLAKE/TURNER
11 JAMES /KING/BLAKE/JAMES
12 CLARK /KING/CLARK
13 MILLER /KING/CLARK/MILLER
--connect by中的條件在除過第一行外執行
select rownum,ename,sys_connect_by_path(ename,'/') from scott.emp
start with mgr is null
connect by prior empno=mgr and ename<>'KING';
ROWNUM ENAME SYS_CONNECT_BY_PATH(ENAME,'/')
1 KING /KING
2 JONES /KING/JONES
3 SCOTT /KING/JONES/SCOTT
4 ADAMS /KING/JONES/SCOTT/ADAMS
5 FORD /KING/JONES/FORD
6 SMITH /KING/JONES/FORD/SMITH
7 BLAKE /KING/BLAKE
8 ALLEN /KING/BLAKE/ALLEN
9 WARD /KING/BLAKE/WARD
10 MARTIN /KING/BLAKE/MARTIN
11 TURNER /KING/BLAKE/TURNER
12 JAMES /KING/BLAKE/JAMES
13 CLARK /KING/CLARK
14 MILLER /KING/CLARK/MILLER
--connect by中的條件在除過第一行外執行,可以過濾掉一個分支
select rownum,ename,sys_connect_by_path(ename,'/') from scott.emp
start with mgr is null
connect by prior empno=mgr and ename<>'JONES';
ROWNUM ENAME SYS_CONNECT_BY_PATH(ENAME,'/')
1 KING /KING
2 BLAKE /KING/BLAKE
3 ALLEN /KING/BLAKE/ALLEN
4 WARD /KING/BLAKE/WARD
5 MARTIN /KING/BLAKE/MARTIN
6 TURNER /KING/BLAKE/TURNER
7 JAMES /KING/BLAKE/JAMES
8 CLARK /KING/CLARK
9 MILLER /KING/CLARK/MILLER
--查詢條件放入子查詢,效果與將查詢條件放在connect by中(除了第一行外)
select rownum, ename, sys_connect_by_path(ename, '/')
from (select * from scott.emp where ename <> 'KING')
start with mgr is null
connect by prior empno = mgr;
no rows selected
--查詢條件放入子查詢,效果與將查詢條件放在connect by中(除了第一行外)
select rownum, ename, sys_connect_by_path(ename, '/')
from (select * from scott.emp where ename <> 'JONES')
start with mgr is null
connect by prior empno = mgr;
ROWNUM ENAME SYS_CONNECT_BY_PATH(ENAME,'/')
1 KING /KING
2 BLAKE /KING/BLAKE
3 ALLEN /KING/BLAKE/ALLEN
4 WARD /KING/BLAKE/WARD
5 MARTIN /KING/BLAKE/MARTIN
6 TURNER /KING/BLAKE/TURNER
7 JAMES /KING/BLAKE/JAMES
8 CLARK /KING/CLARK
9 MILLER /KING/CLARK/MILLER
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18922393/viewspace-773506/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何使用ReentrantLock的條件變數,讓多個執行緒順序執行?ReentrantLock變數執行緒
- SQL語句中的AND和OR執行順序問題SQL
- C++輸出流cout的執行順序問題C++
- GROUPBY 和開窗函式執行順序的問題函式
- SQL中rownum和order by的執行順序的問題SQL
- MySQL的where條件字串區分大小寫的問題MySql字串
- Sql執行順序SQL
- 你瞭解一條sql的執行順序嗎SQL
- switch拼接where條件
- SQL 優先順序join>whereSQL
- [一道題搞蒙你] - setTimeout 與 Promise 執行順序Promise
- 微信小程式wx.login先執行onLaunch與onLoad載入順序問題微信小程式
- js基礎進階–promise和setTimeout執行順序的問題JSPromise
- JavaScript執行順序分析JavaScript
- pipeline的執行順序
- mySQL 執行語句執行順序MySql
- Python執行緒專題10:queue、多執行緒按順序執行Python執行緒
- [20201224]order by欄位順序與查詢條件為NULL.txtNull
- 生產資料update沒加where條件(從執行到恢復)
- mysql 中sql語句關鍵字的書寫順序與執行順序MySql
- promise、async、await非同步原理與執行順序PromiseAI非同步
- SQL語句執行順序SQL
- Select語句執行順序
- js執行順序Event LoopJSOOP
- Spring Aop的執行順序Spring
- sql mysql 執行順序 (4)MySql
- ORACLE sql merge into update where條件位置與效能消耗OracleSQL
- sql語句執行順序與效能優化(1)SQL優化
- 同步任務與非同步任務執行順序非同步
- Pytest 順序執行,依賴執行,引數化執行
- async await、Promise、setTimeout執行順序AIPromise
- js解惑-函式執行順序JS函式
- [20191215]seq控制執行順序.txt
- SQL 語句的執行順序SQL
- mysql 語句的執行順序MySql
- 關於 Promise 的執行順序Promise
- sql select語法執行順序SQL
- 聊聊如何讓springboot攔截器的執行順序按我們想要的順序執行Spring Boot
- join、volatile、newSingleThreadLatch 實現執行緒順序執行thread執行緒