日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]一.WITH AS的含義?WITH AS短語(yǔ),也叫做子查詢(xún)部分(subquery factoring),可以讓你做很多事情,定義一個(gè)SQL片斷,該SQL片斷會(huì)被整個(gè)SQL語(yǔ)句所用到。有的時(shí)候,是為了讓

一.WITH AS的含義?

WITH AS短語(yǔ),也叫做子查詢(xún)部分(subquery factoring),可以讓你做很多事情,定義一個(gè)SQL片斷,該SQL片斷會(huì)被整個(gè)SQL語(yǔ)句所用到。有的時(shí)候,是為了讓SQL語(yǔ)句的可讀性更高些,也有可能是在UNION ALL的不同部分,作為提供數(shù)據(jù)的部分。
特別對(duì)于UNION ALL比較有用。因?yàn)閁NION ALL的每個(gè)部分可能相同,但是如果每個(gè)部分都去執(zhí)行一遍的話,則成本太高,所以可以使用WITH AS短語(yǔ),則只要執(zhí)行一遍即可。如果WITH AS短語(yǔ)所定義的表名被調(diào)用兩次以上,則優(yōu)化器會(huì)自動(dòng)將WITH AS短語(yǔ)所獲取的數(shù)據(jù)放入一個(gè)TEMP表里,如果只是被調(diào)用一次,則不會(huì)。而提示materialize則是強(qiáng)制將WITH AS短語(yǔ)里的數(shù)據(jù)放入一個(gè)全局臨時(shí)表里。很多查詢(xún)通過(guò)這種方法都可以提高速度。
二.使用方法
先看下面一個(gè)嵌套的查詢(xún)語(yǔ)句:

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


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

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

[?WITH[?,n?]?]::=
expression_name?[?(?column_name?[?,n?]?)?]
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á)式在使用上與表變量類(lèi)似,只是SQL Server 2005在處理公用表表達(dá)式的方式上有所不同。

在使用CTE時(shí)應(yīng)注意如下幾點(diǎn):
1. CTE后面必須直接跟使用CTE的SQL語(yǔ)句(如select、insert、update等),否則,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á)式名稱(chēng)與某個(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 中使用以下子句:

(1)COMPUTE 或 COMPUTE BY

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

(3)INTO

(4)帶有查詢(xún)提示的 OPTION 子句

(5)FOR XML

(6)FOR 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)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉