SQL 2005 with 臨時表用法

2022-02-05 02:00:31 字數 3119 閱讀 2518

一.with as的含義

with as短語,也叫做子查詢部分(subquery factoring),可以讓你做很多事情,定義乙個sql片斷,該sql片斷會被整個sql語句所用到。有的時候,是為了讓sql語句的可讀性更高些,也有可能是在union all的不同部分,作為提供資料的部分。

特別對於union all比較有用。因為union all的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,所以可以使用with as短語,則只要執行一遍即可。如果with as短語所定義的表名被呼叫兩次以上,則優化器會自動將with as短語所獲取的資料放入乙個temp表裡,如果只是被呼叫一次,則不會。而提示materialize則是強制將with as短語裡的資料放入乙個全域性臨時表裡。很多查詢通過這種方法都可以提高速度。

二.使用方法

先看下面乙個巢狀的查詢語句:

select * from person.stateprovince where countryregioncode in

(select countryregioncode from person.countryregion where name like 'c%')

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語句要比第一種方式更複雜,但卻將子查詢放在了表變數@t中,這樣做將使sql語句更容易維護,但又會帶來另乙個問題,就是效能的損失。由於表變數實際上使用了臨時表,從而增加了額外的i/o開銷,因此,表變數的方式並不太適合資料量大且頻繁查詢的情況。為此,在sql server 2005中提供了另外一種解決方案,這就是公用表表示式(cte),使用cte,可以使sql語句的可維護性,同時,cte要比表變數的效率高得多。

下面是cte的語法:

[ with [ ,n ] ]

::=expression_name [ ( column_name [ ,n ] ) ]

as( cte_query_definition )

現在使用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是乙個公用表表示式,該表示式在使用上與表變數類似,只是sql server 2005在處理公用表表示式的方式上有所不同。

在使用cte時應注意如下幾點:

1. cte後面必須直接跟使用cte的sql語句(如select、insert、update等),否則,cte將失效。如下面的sql語句將無法正常使用cte:

with

cr as

(select countryregioncode from person.countryregion where name like 'c%'

)select * from person.countryregion  -- 應將這條sql語句去掉

-- 使用cte的sql語句應緊跟在相關的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的表示式名稱與某個資料表或檢視重名,則緊跟在該cte後面的sql語句使用的仍然是cte,當然,後面的sql語句使用的就是資料表或檢視了,如下面的sql語句所示:

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

with

table1 as

(select * from persons where age < 30

)select * from table1  --  使用了名為table1的公共表表示式

select * from table1  --  使用了名為table1的資料表

4. cte 可以引用自身,也可以引用在同一 with 子句中預先定義的 cte。不允許前向引用。

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

(1)compute 或 compute by

(2)order by(除非指定了 top 子句)

(3)into

(4)帶有查詢提示的 option 子句

(5)for xml

(6)for browse

6. 如果將 cte 用在屬於批處理的一部分的語句中,那麼在它之前的語句必須以分號結尾,如下面的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)

SQL臨時表刪除

刪除sql server臨時表和一般表並不相同,下面將為您為別示例錯誤和正確的刪除操作,供您參考,希望對您能夠有所幫助。臨時表與一般的表不同,它是儲存到tempdb表中。臨時表的表名與你所建的表名也不一樣,因為他要為不同人的相同操作建立不同的臨時表。1 錯誤的刪除操作 錯誤的臨時表刪除操作,因為所在...

mysql 臨時表 漢字 mysql的臨時表用法

delimiter use qgroupdata drop procedure if exists ex print bg kdd search create definer root procedure ex print bg kdd search where varchar 2000 查詢條件 ...

SQL臨時表和永久表

臨時表與永久表相似,但臨時表儲存在 tempdb 中,當不再使用時會自動刪除。臨時表有兩種型別 本地和全域性。它們在名稱 可見性以 及可用性上有區別。本地臨時表的名稱以單個數字符號 打頭 它們僅對當前的使用者連線是可見的 當使用者從 sql server 例項斷開連線時被刪除。全域性臨時表的名稱以兩...