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

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

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

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

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

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

        先看下面一個(gè)嵌套的查詢語(yǔ)句:

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

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

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

        下面是CTE的語(yǔ)法:

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

        現(xiàn)在使用CTE來(lái)解決上面的問(wèn)題,SQL語(yǔ)句如下:

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

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


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

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


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

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

    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á)式名稱與某個(gè)數(shù)據(jù)表或視圖重名,則緊跟在該CTE后面的SQL語(yǔ)句使用的仍然是CTE,當(dāng)然,后面的SQL語(yǔ)句使用的就是數(shù)據(jù)表或視圖了,如下面的SQL語(yǔ)句所示:

     

    --  table1是一個(gè)實(shí)際存在的表

    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 用在屬于批處理的一部分的語(yǔ)句中,那么在它之前的語(yǔ)句必須以分號(hào)結(jié)尾,如下面的SQL所示:

     

     

    declare @s nvarchar(3)
    set @s = 'C%'
    ;  
    -- 必須加分號(hào)
    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除了可以簡(jiǎn)化嵌套SQL語(yǔ)句外,還可以進(jìn)行遞歸調(diào)用,關(guān)于這一部分的內(nèi)容將在下一篇文章中介紹。

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





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

    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 銀河使者 閱讀(4976) 評(píng)論(3)  編輯  收藏 所屬分類: SQL Serverdatabases 原創(chuàng)

    評(píng)論

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

    不錯(cuò)...
    2009-01-31 18:57 | ci

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

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

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

    以前都沒(méi)怎么接觸這些 學(xué)習(xí)了
    2010-05-03 00:20 | 菜鳥(niǎo)
    主站蜘蛛池模板: 成人免费a级毛片| 免费一级国产生活片| 亚洲综合另类小说色区| 亚洲人成图片网站| 在线毛片片免费观看| 国产一区二区三区在线观看免费 | 亚洲精品中文字幕乱码三区| 亚洲中文字幕无码亚洲成A人片| 男人j进入女人j内部免费网站| 亚洲国产中文字幕在线观看| 亚洲色大成网站www永久男同| 久视频精品免费观看99| 亚洲乱码国产一区三区| 五月婷婷免费视频| 巨胸喷奶水视频www网免费| 亚洲精品国产第1页| 久久久久久久99精品免费| 国产亚洲美女精品久久久| 黄色网址大全免费| 日本黄页网站免费| 亚洲国产日韩视频观看| 黄网站色在线视频免费观看| 亚洲AV无码成人精品区天堂| 成人免费一区二区三区| 亚洲国产天堂久久综合| 男男gvh肉在线观看免费| 在线免费一区二区| 国产AV旡码专区亚洲AV苍井空| 国产免费丝袜调教视频| 色播亚洲视频在线观看| 国产高清不卡免费视频| 久久精品国产亚洲综合色| 国产日韩久久免费影院| 亚洲人成人无码网www国产| 全部一级一级毛片免费看| 国产精品久久免费视频| 亚洲AV无码精品国产成人| 麻豆成人精品国产免费| 亚洲国产精品无码久久久秋霞1| 成人超污免费网站在线看| 日韩亚洲不卡在线视频中文字幕在线观看 |