當前位置:
首頁 >
ORACLE-WITH 子句详解
發布時間:2025/3/21
71
豆豆
生活随笔
收集整理的這篇文章主要介紹了
ORACLE-WITH 子句详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概述
with 子句是在oracle 9i release 2 中引入的。with 子句又叫做子查詢構造語句。可以用來給一個子查詢塊命名。
該查詢塊的檢索結果會被oracle 保存在用戶的臨時表空間中,該命名塊就像虛表或者內聯視圖一樣。
語法
WITH subquery_name AS (the aggregation SQL statement) SELECT (query naming subquery_name);With查詢語句不是以select開始的,而是以“WITH”關鍵字開頭。
可認為在真正進行查詢之前預先構造了一個臨時表TT,之后便可多次使用它做進一步的分析和處理
優點
使用SQL with 子句的優點,
- 增加了SQL的易讀性,如果構造了多個子查詢,結構會更清晰
- 更重要的是:“一次分析,多次使用”。當在一個sql 語句中需要多次使用到某個子查詢的結果的時候,可以提升sql 語句的性能。 這也是為什么會提供性能的地方,達到了“少讀”的目標。
栗子
取 5到10的數據,通常我們寫如下sql:
select * from (select level as lv from dual connect by level < 10 ) tt where tt.lv between 5 and 10 ;現在改為 使用With as 的SQL:
with tt as (select level as lv from dual connect by level <10)select tt.lv from tt where tt.lv between 5 and 10 ;實戰
查詢系統菜單的后臺sql
WITH TEMPVIEW AS(SELECT B.MENU_ID AS PARTY_ID,'1' AS TYPE,B.DIR_ID AS PARENT_ID,A.PRIV_NAME AS PARTY_NAME,A.URL,A.IS_HOLD,A.IS_AUTHORIZEDFROM BFM_PRIV A, BFM_MENU_DIR BWHERE A.PRIV_ID = B.MENU_IDAND A.STATE = 'A'AND B.DIR_ID IN (SELECT DIR_IDFROM BFM_DIRSTART WITH DIR_ID = :1 --綁定變量CONNECT BY PRIOR DIR_ID = PARENT_IDAND STATE = 'A')UNION ALLSELECT C.DIR_ID AS PARTY_ID,'0' AS TYPE,C.PARENT_ID,C.DIR_NAME AS PARTY_NAME,NULL,NULL,NULLFROM BFM_DIR CSTART WITH DIR_ID = :2 --綁定變量CONNECT BY PRIOR DIR_ID = PARENT_IDAND STATE = 'A') SELECT * FROM TEMPVIEWSTART WITH PARTY_ID = :3 --綁定變量 CONNECT BY PRIOR PARTY_ID = PARENT_IDORDER SIBLINGS BY PARTY_ID ;ORDER SIBLINGS BY的意思就是在兄弟姐妹之間的排序,和order by所表示的含義絕對不同,針對樹狀sql,我覺得ORDER SIBLINGS BY更有意義,樹狀sql查詢出來的結果本身就是按照層次(hierarchy)結構排好序的,而加上關鍵字SIBLINGS 其實是在hierarchy內部進行排序。
在層次查詢中如需對親兄弟的先后順序進行限定,就必須要使用特有的“ORDER SIBLINGS BY”而非“ORDER BY”子句。切記之。
總結
以上是生活随笔為你收集整理的ORACLE-WITH 子句详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle-绑定变量binding v
- 下一篇: Oracle优化06-Hint