<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-9  評論-168  文章-266  trackbacks-0
    1、with table as 相當于建個臨時表(用于一個語句中某些中間結果放在臨時表空間的SQL語句),Oracle 9i 新增WITH語法,可以將查詢中的子查詢命名,放到SELECT語句的最前面。

    語法就是
    with tempname as (select ....)
    select ...

    例子:
    with t as (select * from emp where depno=10)
    select * from t where empno=xxx

    with
    wd as (select did,arg(salary) 平均工資 from work group by did),
    em as (select emp.*,w.salary from emp left join work w on emp.eid = w.eid)
    select * from wd,em where wd.did =em.did and wd.平均工資>em.salary;



    2、何時被清除
    臨時表不都是會話結束就自動被PGA清除嘛! 但with as臨時表是查詢完成后就被清除了!
    23:48:58 SCOTT@orcl> with aa as(select * from dept)
    23:57:58   2  select * from aa;

        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON

    已用時間:  00: 00: 00.12
    23:58:06 SCOTT@orcl> select * from aa;
    select * from aa
                  *
    第 1 行出現錯誤:
    ORA-00942: 表或視圖不存在


    已用時間:  00: 00: 00.02
    23:58:14 SCOTT@orcl>

    3、就這一功能來說,子查詢就可以達到啊,為什么要用with呢? 用with有什么好處?
    都能寫,但執行計劃不同的。當有多個相似子查詢的時候,用with寫公共部分,因為子查詢結果在內存臨時表中,執行效率當然就高啦~

    4、問題:
    有張表數據如下:
    aaa 高
    bbb 低
    aaa 低
    aaa 高
    bbb 低
    bbb 高
    需要得到下列結果,
      高 低
    aaa 2 1
    bbb 1 2
    問 SQL 語句怎么寫??

    答案:
    with tt as (
      select 'aaa' id, '高' value from dual union all
      select 'bbb' id, '低' value from dual union all
      select 'aaa' id, '低' value from dual union all
      select 'aaa' id, '高' value from dual union all
      select 'bbb' id, '低' value from dual union all
      select 'bbb' id, '高' value from dual)
    SELECT id,
           COUNT(decode(VALUE, '高', 1)) 高,
           COUNT(decode(VALUE, '低', 1)) 低
      FROM tt
     GROUP BY id;
    ===================================================================
    擴展:
    Oracle9i新增WITH語法,可以將查詢中的子查詢命名,放到SELECT語句的最前面。

      一個簡單的例子:

    SQL> WITH
    2 SEG AS (SELECT SEGMENT_NAME, SUM(BYTES)/1024 K FROM USER_SEGMENTS GROUP BY SEGMENT_NAME),
    3 OBJ AS (SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS)
    4 SELECT O.OBJECT_NAME, OBJECT_TYPE, NVL(S.K, 0) SIZE_K
    5 FROM OBJ O, SEG S
    6 WHERE O.OBJECT_NAME = S.SEGMENT_NAME (+)
    7 ;
    OBJECT_NAME OBJECT_TYPE SIZE_K
    ------------------------------ ------------------- ----------
    DAIJC_TEST TABLE 128
    P_TEST PROCEDURE 0
    IND_DAIJC_TEST_C1 INDEX 128

      通過WITH語句定義了兩個子查詢SEG和OBJ,在隨后的SELECT語句中可以直接對預定義的子查詢進行查詢。從上面的例子也可以看出,使用WITH語句,將一個包含聚集、外連接等操作SQL清晰的展現出來。

      WITH定義的子查詢不僅可以使查詢語句更加簡單、清晰,而且WITH定義的子查詢還具有在SELECT語句的任意層均可見的特點。

      即使是在WITH的定義層中,后定義的子查詢都可以使用前面已經定義好的子查詢:

    SQL> WITH
    2 Q1 AS (SELECT 3 + 5 S FROM DUAL),
    3 Q2 AS (SELECT 3 * 5 M FROM DUAL),
    4 Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2)
    5 SELECT * FROM Q3;
    S M S+M S*M
    ---------- ---------- ---------- ----------
    8 15 23 120

      利用WITH定義查詢中出現多次的子查詢還能帶來性能提示。Oracle會對WITH進行性能優化,當需要多次訪問WITH定義的子查詢時,Oracle會將子查詢的結果放到一個臨時表中,避免同樣的子查詢多次執行,從而有效的減少了查詢的IO數量。

    WITH能用在SELECT語句中,UPDATE和DELETE語句也是支持WITH語法的,只是需要版本支持:
    http://www.oracle.com.cn/viewthread.php?tid=83530

    =============================================================================
    with
    sql1 as (select to_char(a) s_name from test_tempa),
    sql2 as (select to_char(b) s_name from test_tempb where not exists (select s_name from sql1 where rownum=1))
    select * from sql1
    union all
    select * from sql2
    union all
    select 'no records' from dual
           where not exists (select s_name from sql1 where rownum=1)
           and not exists (select s_name from sql2 where rownum=1);

    再舉個簡單的例子

    with a as (select * from test)

    select * from a;

    其實就是把一大堆重復用到的SQL語句放在with as 里面,取一個別名,后面的查詢就可以用它

    這樣對于大批量的SQL語句起到一個優化的作用,而且清楚明了


    這是搜索到的英文文檔資料(說得比較全,但是本人英文特菜,還沒具體了解到,希望各高手具體談談這個with
    as 的好處)

    About Oracle WITH clause
    Starting in Oracle9i release 2 we see an incorporation of the SQL-99 “WITH clause”, a tool for materializing subqueries to save Oracle from having to re-compute them multiple times.

    The SQL “WITH clause” is very similar to the use of Global temporary tables (GTT), a technique that is often used to improve query speed for complex subqueries. Here are some important notes about the Oracle “WITH clause”:

       ? The SQL “WITH clause” only works on Oracle 9i release 2 and beyond.
       ? Formally, the “WITH clause” is called subquery factoring
       ? The SQL “WITH clause” is used when a subquery is executed multiple times
       ? Also useful for recursive queries (SQL-99, but not Oracle SQL)

    To keep it simple, the following example only references the aggregations once, where the SQL “WITH clause” is normally used when an aggregation is referenced multiple times in a query.
    We can also use the SQL-99 “WITH clause” instead of temporary tables. The Oracle SQL “WITH clause” will compute the aggregation once, give it a name, and allow us to reference it (maybe multiple times), later in the query.

    The SQL-99 “WITH clause” is very confusing at first because the SQL statement does not begin with the word SELECT. Instead, we use the “WITH clause” to start our SQL query, defining the aggregations, which can then be named in the main query as if they were “real” tables:

    WITH
    subquery_name
    AS
    (the aggregation SQL statement)
    SELECT
    (query naming subquery_name);

    Retuning to our oversimplified example, let’s replace the temporary tables with the SQL “WITH  clause”:

    WITH
    sum_sales AS
      select /*+ materialize */
        sum(quantity) all_sales from stores
    number_stores AS
      select /*+ materialize */
        count(*) nbr_stores from stores
    sales_by_store AS
      select /*+ materialize */
      store_name, sum(quantity) store_sales from
      store natural join sales
    SELECT
       store_name
    FROM
       store,
       sum_sales,
       number_stores,
       sales_by_store
    where
       store_sales > (all_sales / nbr_stores)
    ;

    Note the use of the Oracle undocumented “materialize” hint in the “WITH clause”. The Oracle materialize hint is used to ensure that the Oracle cost-based optimizer materializes the temporary tables that are created inside the “WITH” clause. This is not necessary in Oracle10g, but it helps ensure that the tables are only created one time.

    It should be noted that the “WITH clause” does not yet fully-functional within Oracle SQL and it does not yet support the use of “WITH clause” replacement for “CONNECT BY” when performing recursive queries.

    To see how the “WITH clause” is used in ANSI SQL-99 syntax, here is an excerpt from Jonathan Gennick’s great work “Understanding the WITH Clause” showing the use of the SQL-99 “WITH clause” to traverse a recursive bill-of-materials hierarchy

    The SQL-99 “WITH clause” is very confusing at first because the SQL statement does not begin with the word SELECT. Instead, we use the “WITH clause” to start our SQL query, defining the aggregations, which can then be named in the main query as if they were “real” tables:

    WITH
    subquery_name
    AS
    (the aggregation SQL statement)
    SELECT
    (query naming subquery_name);

    Retuning to our oversimplified example, let’s replace the temporary tables with the SQL “WITH” clause”:
    posted on 2011-12-06 16:47 紫蝶∏飛揚↗ 閱讀(23197) 評論(0)  編輯  收藏 所屬分類: 數據庫
    主站蜘蛛池模板: 99国产精品免费观看视频| 日本亚洲中午字幕乱码| 亚洲第一AV网站| 久久亚洲sm情趣捆绑调教| yy一级毛片免费视频| 日本高清免费中文字幕不卡| 亚洲国产精品丝袜在线观看| 久久国产亚洲观看| 成人A片产无码免费视频在线观看| 免费国产黄网站在线观看可以下载| 亚洲精品无码久久久久| 东北美女野外bbwbbw免费| 国产gv天堂亚洲国产gv刚刚碰| 久久高潮一级毛片免费| 成熟女人特级毛片www免费| 亚洲自偷自偷在线制服| jizz免费观看视频| 午夜一级毛片免费视频| 亚洲a∨无码一区二区| 免费成人午夜视频| 亚洲精品久久无码| 三年片在线观看免费观看大全一 | 偷自拍亚洲视频在线观看99| 一级毛片成人免费看免费不卡 | 成年女人喷潮毛片免费播放| 亚洲欧美熟妇综合久久久久| 色欲国产麻豆一精品一AV一免费 | 91网站免费观看| 亚洲av午夜福利精品一区| 无人视频免费观看免费视频| 青青草国产免费久久久91| 国产亚洲综合久久| 久久久久久亚洲精品| 免费观看黄网站在线播放| 亚洲同性男gay网站在线观看| 四色在线精品免费观看| 999zyz**站免费毛片| 亚洲人成人无码网www电影首页 | 成年人在线免费观看| 又黄又大的激情视频在线观看免费视频社区在线 | 国产va精品免费观看|