久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    With temp as---sql語句用法

     開心豆豆2010 2012-04-16
    3.1 with基礎(chǔ)

      

      使用WITH AS 語句可以為一個(gè)子查詢語句塊定義一個(gè)名稱,使用這個(gè)子查詢名稱可以在查詢語句的很多地方引用這個(gè)子查詢。Oracle 數(shù)據(jù)庫像對(duì)待內(nèi)聯(lián)視圖或臨時(shí)表一樣對(duì)待被引用的子查詢名稱,從而起到一定的優(yōu)化作用。with子句是9i新增語法。

      你可以在任何一個(gè)頂層的SELECT 語句以及幾乎所有類型的子查詢語句前,使用子查詢定義子句。被定義的子查詢名稱可以在主查詢語句以及所有的子查詢語句中引用,但未定義前不能引用。

      with子句中不能嵌套定義<也就是with子句中不能有with子句>,但子查詢中出現(xiàn)的子查詢定義語句可以引用已定義的子查詢名稱。<可以引用前面已經(jīng)定義的with子句>

      with子句相關(guān)總結(jié):

      

      1.使用with子句可以讓子查詢重用相同的with查詢塊,通過select調(diào)用(with子句只能被select查詢塊引用),一般在with查詢用到多次情況下。在引用的select語句之前定義,同級(jí)只能定義with關(guān)鍵字只能使用一次,多個(gè)用逗號(hào)分割。

      2.with子句的返回結(jié)果存到用戶的臨時(shí)表空間中,只做一次查詢,反復(fù)使用,提高效率。

      3.在同級(jí)select前有多個(gè)查詢定義的時(shí)候,第1個(gè)用with,后面的不用with,并且用逗號(hào)隔開。

      5.最后一個(gè)with 子句與下面的查詢之間不能有逗號(hào),只通過右括號(hào)分割,with 子句的查詢必須用括號(hào)括起來

       6.如果定義了with子句,而在查詢中不使用,那么會(huì)報(bào)ora-32035 錯(cuò)誤:未引用在with子句中定義的查詢名。(至少一個(gè)with查詢的name未被引用,解決方法是移除未被引用的with查詢),注意:只要后面有引用 的就可以,不一定非要在主查詢中引用,比如后面的with查詢也引用了,也是可以的。

      7.前面的with子句定義的查詢?cè)诤竺娴膚ith子句中可以使用。但是一個(gè)with子句內(nèi)部不能嵌套with子句。

      8.當(dāng)一個(gè)查詢塊名字和一個(gè)表名或其他的對(duì)象相同時(shí),解析器從內(nèi)向外搜索,優(yōu)先使用子查詢塊名字。

      9.with查詢的結(jié)果列有別名,引用的時(shí)候必須使用別名或*。

      with子句優(yōu)點(diǎn):

      

      1. SQL可讀性增強(qiáng)。比如對(duì)于特定with子查詢?nèi)€(gè)有意義的名字等。

      2. with子查詢只執(zhí)行一次,將結(jié)果存儲(chǔ)在用戶臨時(shí)表空間中,可以引用多次,增強(qiáng)性能。

      with子句語法:

      With alias_name as (select1), --as和select中的括號(hào)都不能省略

      alias_name2 as (select2),--后面的沒有with,逗號(hào)分割,同一個(gè)主查詢同級(jí)別地方,with子查詢只能定義一次

      …

      alias_namen as (select n) –與下面的實(shí)際查詢之間沒有逗號(hào)

      Select ….

      with使用例子:

      1.一般使用方式

      

      如查詢銷售部門員工的姓名:

      --with clause

      with a as

      (select id from s_dept where name=Sales order by id)

      select last_name,title

      from s_emp where dept_id in (select * from a);--使用select查詢別名

      使用with 子句,可以在復(fù)雜的查詢中預(yù)先定義好一個(gè)結(jié)果集,然后在查詢中反復(fù)使用,不使用會(huì)報(bào)錯(cuò)。而且with 子句獲得的是一個(gè)臨時(shí)表,如果在查詢中使用,必須采用select from with 查詢名,比如

      With cnt as(select count(*) from table)

      Select cnt+1 from dual;

      是錯(cuò)誤的。必須是

      With cnt as(select count(*) shumu from user_tables)

      Select shumu+1 from cnt;

      2.在大多數(shù)子查詢中引用,同級(jí)可見

      

      再如下面兩個(gè)語句含義等價(jià):

      with a as (select trade_id,name from product) --使用之前定義

      select name from a where a.trade_id in (

      with b as (select id from trademark where id=1) --使用之前定義

      select id from b

      );

      select name from product where trade_id in (select id from trademark where id=1);

      3. with子查詢不可嵌套定義,但是后面的with定義可以引用前面的結(jié)果集。

      

      with select_trade as (select trade_id from product where id=1),

      --后面的with子查詢可以引用前面的結(jié)果

      select_trademark as (select name from trademark where id=(select trade_id from select_trade))

      select * from select_trademark;

      --這條語句錯(cuò)誤

      with select_trade as

      --with中有嵌套with,不允許

      ( with temp as ( select trade_id from product where id=1)

      select trade_id from temp

      ),

      select_trademark as (select name from trademark where id=(select trade_id from select_trade))

      select * from select_trademark;

      4. 同級(jí)定義,只能有一個(gè)with

      

      with a as (select trade_id from product),

      b as (select id from trademark where rownum<3) --第2個(gè)定義不用with

      select trade_id from a

      minus

      select id from b;

    5. 在大多數(shù)子查詢中定義和使用,一個(gè)復(fù)雜的例子

      

      SELECT a ,b

      FROM (

      --第1個(gè)定義t_with

      WITH

      t_with AS (SELECT 1 a FROM DUAL)

      --子查詢使用t_with

      SELECT x.a ,(

      --內(nèi)部定義了個(gè)t_with_z,并且使用t_with

      WITH t_with_z as (SELECT 1 a FROM t_with )

      SELECT s_1.a FROM t_with_z s_1 ,t_with s_2

      6. 集合中使用with子查詢

      

      --這個(gè)是錯(cuò)誤的,同級(jí)只能有一個(gè)with定義,當(dāng)然兩個(gè)可以寫在一起。

      SELECT *

      FROM (

      WITH

      t_with_1 AS (SELECT 1 a ,1 b FROM DUAL)

      --此后的整個(gè)語句被認(rèn)為是一個(gè)主查詢語句

      SELECT x.a , x.b FROM t_with_1 x

      union all

      WITH -- 此處再次出現(xiàn)定義

      t_with_2 AS (SELECT 1 a ,2 b FROM DUAL)

      SELECT y.a ,y.b FROM t_with_2 y

      --正確

      SELECT *

      FROM (

      --第1個(gè)with

      WITH

      t_with_1 AS (SELECT 1 a ,1 b FROM DUAL)

      SELECT x.a , x.b ,x c FROM t_with_1 x

      union all

      --這里不能用with再次定義,同級(jí)只能有1個(gè)with,可以寫在最前面

      --內(nèi)部with

      SELECT y.a ,y.b , (WITH

      t_with_x AS (SELECT * FROM t_with_1)

      SELECT a FROM t_with_x )

      FROM ( WITH

      t_with_2 AS (SELECT 1 a ,2 b FROM DUAL)

      SELECT a ,b FROM t_with_2

      ) y

      WHERE y.a = (

      with t_with_3 AS (SELECT 1 a ,2 b FROM DUAL)

      select a from t_with_3

      )

      )

      7.一個(gè)with查詢的實(shí)例:

      

       查詢出部門的總薪水大于所有部門平均總薪水的部門。部門表s_dept,員工表s_emp。分析:做這個(gè)查詢,首先必須計(jì)算出所有部門的總薪 水,然后計(jì)算出總薪水的平均薪水,再篩選出部門的總薪水大于所有部門總薪水平均薪水的部門。那么第1 步with 查詢查出所有部門的總薪水,第2 步用with 從第1 步獲得的結(jié)果表中查詢出平均薪水,最后利用這兩次的with 查詢比較總薪水大于平均薪水的結(jié)果,如下:

      with

      --step1:查詢出部門名和部門的總薪水

      dept_costs as(

      select a.name,sum(b.salary) dept_total

      from

      s_dept a,s_emp b

      where a.id=b.dept_id

      group by a.name

      ),

      --step2:利用上一個(gè)with查詢的結(jié)果,計(jì)算部門的平均總薪水

      avg_costs as(

      select sum(dept_total)/count(*) dept_avg

      from dept_costs

      )

      --step3:從兩個(gè)with查詢中比較并且輸出查詢結(jié)果

      select name,dept_total

      from dept_costs

      where

      dept_total>

      (

      select dept_avg

      from

      avg_costs

      )

      order by name;

      從上面的查詢可以看出,前面的with 查詢的結(jié)果可以被后面的with查詢重用,并且對(duì)with 查詢的結(jié)果列支持別名的使用,在最終查詢中必須要引用所有with 查詢,否則會(huì)報(bào)錯(cuò)ora-32035 錯(cuò)誤。

      再如有這樣一個(gè)需求:一個(gè)查詢,如果查詢的結(jié)果行不滿足是10 的倍數(shù),則補(bǔ)空行,直到是查詢出的行數(shù)是10 的倍數(shù)。例如:select * from trademark這個(gè)查詢。

    with子句

    3.2 11G R2with新特性

      

      新版本的WITH 允許遞歸使用,在功能上比原來有了質(zhì)的飛躍,可以實(shí)現(xiàn)許多原來CONNECT BY做不到的事。

      3.3 with對(duì)執(zhí)行計(jì)劃的影響

      

      with子句有可能會(huì)改變執(zhí)行計(jì)劃。

      本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶 評(píng)論公約

      類似文章 更多

      主站蜘蛛池模板: 亚洲一区二区偷拍精品| 中文字幕永久精品国产| 最新国产精品中文字幕| 亚洲AV国产福利精品在现观看| 老司机67194精品线观看| 色屁屁WWW免费看欧美激情| 羞羞影院午夜男女爽爽免费视频 | 久久精品国产亚洲av麻豆软件| 日韩丝袜欧美人妻制服| 国产亚洲一区二区在线观看| av在线播放国产一区| 亚洲色大成网站WWW尤物| 无码人妻丝袜在线视频| 邻居少妇张开腿让我爽了一夜 | 亚洲成AV人片在线观看麦芽| 亚洲精品成人福利网站| 亚洲AV无码乱码在线观看牲色| 国产精品美女久久久久久麻豆 | 国产成人午夜精品福利| 亚洲欧美中文字幕5发布| 国色天香成人一区二区| 亚洲成AV人无码综合在线| 精品无码日韩国产不卡AV| 国产成人无码免费视频在线| 日产精品99久久久久久| 亚洲午夜成人精品电影在线观看 | 天堂中文8资源在线8| 少妇人妻偷人精品视蜜桃| 日韩丝袜欧美人妻制服| 67194熟妇在线观看线路| 啊轻点灬大JI巴太粗太长了欧美| 国产精品不卡区一区二| 精品无人区一区二区三区| 美日韩在线视频一区二区三区 | 色猫咪av在线网址| 国产成人亚洲综合| 成人做受视频试看60秒| 国内不卡一区二区三区| AV老司机亚洲精品天堂| 丰满的熟妇岳中文字幕| 手机看片日本在线观看视频|