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

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

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

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數(shù)據(jù)加載中……

    SQL Server2005雜談(1):使用公用表表達(dá)式(CTE)簡化嵌套SQL

    本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

        先看下面一個嵌套的查詢語句:

    select * from person.StateProvince where CountryRegionCode in 
             (
    select CountryRegionCode from person.CountryRegion where Name like 'C%')

        上面的查詢語句使用了一個子查詢。雖然這條SQL語句并不復(fù)雜,但如果嵌套的層次過多,會使SQL語句非常難以閱讀和維護。因此,也可以使用表變量的方式來解決這個問題,SQL語句如下:

    declare @t table(CountryRegionCode nvarchar(3))
    insert into @t(CountryRegionCode)  (select CountryRegionCode from person.CountryRegion where Name like 'C%')

    select * from person.StateProvince where CountryRegionCode 
                         
    in (select * from @t)

        雖然上面的SQL語句要比第一種方式更復(fù)雜,但卻將子查詢放在了表變量@t中,這樣做將使SQL語句更容易維護,但又會帶來另一個問題,就是性能的損失。由于表變量實際上使用了臨時表,從而增加了額外的I/O開銷,因此,表變量的方式并不太適合數(shù)據(jù)量大且頻繁查詢的情況。為此,在SQL Server 2005中提供了另外一種解決方案,這就是公用表表達(dá)式(CTE),使用CTE,可以使SQL語句的可維護性,同時,CTE要比表變量的效率高得多。

        下面是CTE的語法:

    [ WITH <common_table_expression> [ ,] ]
    <common_table_expression>::=
            expression_name 
    [ ( column_name [ ,] ) ]
        
    AS
            ( CTE_query_definition )

        現(xiàn)在使用CTE來解決上面的問題,SQL語句如下:

    with
    cr 
    as
    (
        
    select CountryRegionCode from person.CountryRegion where Name like 'C%'
    )

    select * from person.StateProvince where CountryRegionCode in (select * from cr)


        其中cr是一個公用表表達(dá)式,該表達(dá)式在使用上與表變量類似,只是SQL Server 2005在處理公用表表達(dá)式的方式上有所不同。

        在使用CTE時應(yīng)注意如下幾點:
    1. CTE
    后面必須直接跟使用CTESQL語句(如selectinsertupdate等),否則,CTE將失效。如下面的SQL語句將無法正常使用CTE


    with
    cr 
    as
    (
        
    select CountryRegionCode from person.CountryRegion where Name like 'C%'
    )
    select * from person.CountryRegion  -- 應(yīng)將這條SQL語句去掉
    --
     使用CTE的SQL語句應(yīng)緊跟在相關(guān)的CTE后面 --
    select * from person.StateProvince where CountryRegionCode in (select * from cr)

    2. CTE后面也可以跟其他的CTE,但只能使用一個with,多個CTE中間用逗號(,)分隔,如下面的SQL語句所示:

    with
    cte1 
    as
    (
        
    select * from table1 where name like 'abc%'
    ),
    cte2 
    as
    (
        
    select * from table2 where id > 20
    ),
    cte3 
    as
    (
        
    select * from table3 where price < 100
    )
    select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id


    3. 如果CTE的表達(dá)式名稱與某個數(shù)據(jù)表或視圖重名,則緊跟在該CTE后面的SQL語句使用的仍然是CTE,當(dāng)然,后面的SQL語句使用的就是數(shù)據(jù)表或視圖了,如下面的SQL語句所示:

     

    --  table1是一個實際存在的表

    with
    table1 
    as
    (
        
    select * from persons where age < 30
    )
    select * from table1  --  使用了名為table1的公共表表達(dá)式
    select * from table1  --  使用了名為table1的數(shù)據(jù)表

    4. CTE 可以引用自身,也可以引用在同一 WITH 子句中預(yù)先定義的 CTE。不允許前向引用。

    5. 不能在 CTE_query_definition 中使用以下子句:

    1COMPUTE COMPUTE BY

    2ORDER BY(除非指定了 TOP 子句)

    3INTO

    4)帶有查詢提示的 OPTION 子句

    5FOR XML

    6FOR BROWSE

    6. 如果將 CTE 用在屬于批處理的一部分的語句中,那么在它之前的語句必須以分號結(jié)尾,如下面的SQL所示:

     

     

    declare @s nvarchar(3)
    set @s = 'C%'
    ;  
    -- 必須加分號
    with
    t_tree 
    as
    (
        
    select CountryRegionCode from person.CountryRegion where Name like @s
    )
    select * from person.StateProvince where CountryRegionCode in (select * from t_tree)

        CTE除了可以簡化嵌套SQL語句外,還可以進(jìn)行遞歸調(diào)用,關(guān)于這一部分的內(nèi)容將在下一篇文章中介紹。

    下一篇:SQL Server2005雜談(2):公用表表達(dá)式(CTE)的遞歸調(diào)用





    Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2009-01-31 14:40 銀河使者 閱讀(4984) 評論(3)  編輯  收藏 所屬分類: SQL Serverdatabases 原創(chuàng)

    評論

    # re: SQL Server2005雜談(1):使用公用表表達(dá)式(CTE)簡化嵌套SQL  回復(fù)  更多評論   

    不錯...
    2009-01-31 18:57 | ci

    # re: SQL Server2005雜談(1):使用公用表表達(dá)式(CTE)簡化嵌套SQL  回復(fù)  更多評論   

    挺實用的,怎么麼沒人頂啊,都裝大俠了?
    2009-03-05 10:26 | 搞什么搞

    # re: SQL Server2005雜談(1):使用公用表表達(dá)式(CTE)簡化嵌套SQL[未登錄]  回復(fù)  更多評論   

    以前都沒怎么接觸這些 學(xué)習(xí)了
    2010-05-03 00:20 | 菜鳥
    主站蜘蛛池模板: 在线精品免费视频无码的| 九九综合VA免费看| 59pao成国产成视频永久免费 | 羞羞视频免费网站在线看| 亚洲成A人片在线观看无码3D| 丰满亚洲大尺度无码无码专线| 国产成人一区二区三区视频免费| 亚洲色婷婷六月亚洲婷婷6月| 亚洲heyzo专区无码综合| 日本一道本高清免费| 粉色视频成年免费人15次| 久久精品a一国产成人免费网站| 亚洲av无码国产综合专区| 毛片免费在线播放| 在线观看免费亚洲| 亚洲精品国产自在久久 | 亚洲av日韩av欧v在线天堂| 九九久久精品国产免费看小说 | 成人五级毛片免费播放| 亚洲av无码兔费综合| 天堂亚洲免费视频| 成人片黄网站色大片免费观看cn | 亚洲人成在久久综合网站| 成人免费视频小说| 日韩精品免费一线在线观看| 国产偷v国产偷v亚洲高清| 最近中文字幕国语免费完整| 亚洲入口无毒网址你懂的| 日产国产精品亚洲系列| 精品在线免费观看| 亚洲一区二区三区国产精华液| 亚洲M码 欧洲S码SSS222| 久久久久国产精品免费网站| 亚洲中文无码mv| 亚洲熟妇中文字幕五十中出| 亚洲三级在线免费观看| 免费国产高清毛不卡片基地| 亚洲AV无码成人网站久久精品大| 成全高清视频免费观看| 三年片免费观看大全国语| 亚洲影院天堂中文av色|