ORACLE-WITH 子句详解
概述
with 子句是在oracle 9i release 2 中引入的。with 子句又叫做子查詢構(gòu)造語(yǔ)句??梢杂脕?lái)給一個(gè)子查詢塊命名。
該查詢塊的檢索結(jié)果會(huì)被oracle 保存在用戶的臨時(shí)表空間中,該命名塊就像虛表或者內(nèi)聯(lián)視圖一樣。
語(yǔ)法
WITH subquery_name AS (the aggregation SQL statement) SELECT (query naming subquery_name);With查詢語(yǔ)句不是以select開始的,而是以“WITH”關(guān)鍵字開頭。
可認(rèn)為在真正進(jìn)行查詢之前預(yù)先構(gòu)造了一個(gè)臨時(shí)表TT,之后便可多次使用它做進(jìn)一步的分析和處理
優(yōu)點(diǎn)
使用SQL with 子句的優(yōu)點(diǎn),
- 增加了SQL的易讀性,如果構(gòu)造了多個(gè)子查詢,結(jié)構(gòu)會(huì)更清晰
- 更重要的是:“一次分析,多次使用”。當(dāng)在一個(gè)sql 語(yǔ)句中需要多次使用到某個(gè)子查詢的結(jié)果的時(shí)候,可以提升sql 語(yǔ)句的性能。 這也是為什么會(huì)提供性能的地方,達(dá)到了“少讀”的目標(biāo)。
栗子
取 5到10的數(shù)據(jù),通常我們寫如下sql:
select * from (select level as lv from dual connect by level < 10 ) tt where tt.lv between 5 and 10 ;現(xiàn)在改為 使用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 ;實(shí)戰(zhàn)
查詢系統(tǒng)菜單的后臺(tái)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所表示的含義絕對(duì)不同,針對(duì)樹狀sql,我覺得ORDER SIBLINGS BY更有意義,樹狀sql查詢出來(lái)的結(jié)果本身就是按照層次(hierarchy)結(jié)構(gòu)排好序的,而加上關(guān)鍵字SIBLINGS 其實(shí)是在hierarchy內(nèi)部進(jìn)行排序。
在層次查詢中如需對(duì)親兄弟的先后順序進(jìn)行限定,就必須要使用特有的“ORDER SIBLINGS BY”而非“ORDER BY”子句。切記之。
總結(jié)
以上是生活随笔為你收集整理的ORACLE-WITH 子句详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle-绑定变量binding v
- 下一篇: Oracle优化06-Hint