關(guān)于使用CTE(公用表表達式)的遞歸查詢----SQL Server 2005及以上版本
  公用表表達式 (CTE) 具有一個重要的優(yōu)點,那就是能夠引用其自身,從而創(chuàng)建遞歸 CTE。遞歸 CTE 是一個重復執(zhí)行初始 CTE 以返回數(shù)據(jù)子集直到獲取完整結(jié)果集的公用表表達式。
  當某個查詢引用遞歸 CTE 時,它即被稱為遞歸查詢。遞歸查詢通常用于返回分層數(shù)據(jù),例如:顯示某個組織圖中的雇員或物料清單方案(其中父級產(chǎn)品有一個或多個組件,而那些組件可能還有子組件,或者是其他父級產(chǎn)品的組件)中的數(shù)據(jù)。
  遞歸 CTE 可以極大地簡化在 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 語句中運行遞歸查詢所需的代碼。在 SQL Server 的早期版本中,遞歸查詢通常需要使用臨時表、游標和邏輯來控制遞歸步驟流。 
CTE 的基本語法結(jié)構(gòu)如下:
復制代碼 代碼如下:www.CuoXIn.com
    WITH expression_name [ ( column_name [,...n] ) ] 
    AS 
    ( CTE_query_definition ) 
    --只有在查詢定義中為所有結(jié)果列都提供了不同的名稱時,列名稱列表才是可選的。 
    --運行 CTE 的語句為: 
    SELECT <column_list> FROM expression_name;
在使用CTE時應注意如下幾點:CTE后面必須直接跟使用CTE的SQL語句(如select、insert、update等),否則,CTE將失效。如下面的SQL語句將無法正常使用CTE:
復制代碼 代碼如下:www.CuoXIn.com
  with 
  cr as 
  ( 
  select * from 表名 where 條件 
   ) 
  --select * from person.CountryRegion --如果加上這句話后面用到cr將報錯 
  select * from cr
2. CTE后面也可以跟其他的CTE,但只能使用一個with,多個CTE中間用逗號(,)分隔,如下面的SQL語句所示:
復制代碼 代碼如下:www.CuoXIn.com
 
with 
cte1 as 
( 
select * from table1 where name like '測試%' 
), 
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的表達式名稱與某個數(shù)據(jù)表或視圖重名,則緊跟在該CTE后面的SQL語句使用的仍然是CTE,當然,后面的SQL語句使用的就是數(shù)據(jù)表或視圖。4. CTE 可以引用自身,也可以引用在同一 WITH 子句中預先定義的 CTE。
5. 不能在 CTE_query_definition 中使用以下子句:
復制代碼 代碼如下:www.CuoXIn.com
 
COMPUTE 或 COMPUTE BY 
ORDER BY(除非指定了 TOP 子句) 
INTO 
帶有查詢提示的 OPTION 子句 
FOR XML 
FOR BROWSE 
6. 如果將 CTE 用在屬于批處理的一部分的語句中,那么在它之前的語句必須以分號結(jié)尾,如下面的SQL所示:
復制代碼 代碼如下:www.CuoXIn.com
declare @s nvarchar(3) 
set @s = '測試%'; -- 必須加分號 
with 
t_tree as 
( 
select * from 表 where 字段 like @s 
) 
select * from t_tree
------------------------------------操作------------------------------------上面可能對with as說的有點兒
主站蜘蛛池模板:
轮台县|
元氏县|
榆树市|
大关县|
兴海县|
漳平市|
开阳县|
揭西县|
诸城市|
石阡县|
多伦县|
枞阳县|
凤台县|
西青区|
绥滨县|
新津县|
泸溪县|
洞口县|
馆陶县|
南木林县|
项城市|
龙门县|
高尔夫|
汾西县|
昌图县|
肥乡县|
如东县|
珲春市|
万载县|
南部县|
衡南县|
湖南省|
大渡口区|
普安县|
娄烦县|
夏津县|
页游|
泰安市|
石狮市|
枞阳县|
塘沽区|