程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> sql with as用法詳解

sql with as用法詳解

編輯:MSSQL

sql with as用法詳解。本站提示廣大學習愛好者:(sql with as用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是sql with as用法詳解正文


一.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%')

下面的查詢語句應用了一個子查詢。固然這條SQL語句其實不龐雜,但假如嵌套的條理過量,會使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語句要比第一種方法更龐雜,但卻將子查詢放在了表變量@t中,如許做將使SQL語句更輕易保護,但又會帶來另外一個成績,就是機能的喪失。因為表變量現實上應用了暫時表,從而增長了額定的I/O開支,是以,表變量的方法其實不太合適數據量年夜且頻仍查詢的情形。為此,在SQL Server 2005中供給了別的一種處理計劃,這就是公用表表達式(CTE),應用CTE,可使SQL語句的可保護性,同時,CTE要比表變量的效力高很多。
上面是CTE的語法:

[ WITH <common_table_expression> [ ,n ] ]
<common_table_expression>::=
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)
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved