国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

Sql學習第三天――SQL 關于CTE(公用表達式)的遞歸查詢使用

2024-08-31 00:44:13
字體:
來源:轉載
供稿:網友

關于使用CTE(公用表表達式)的遞歸查詢----SQL Server 2005及以上版本

  公用表表達式 (CTE) 具有一個重要的優點,那就是能夠引用其自身,從而創建遞歸 CTE。遞歸 CTE 是一個重復執行初始 CTE 以返回數據子集直到獲取完整結果集的公用表表達式。

  當某個查詢引用遞歸 CTE 時,它即被稱為遞歸查詢。遞歸查詢通常用于返回分層數據,例如:顯示某個組織圖中的雇員或物料清單方案(其中父級產品有一個或多個組件,而那些組件可能還有子組件,或者是其他父級產品的組件)中的數據。

  遞歸 CTE 可以極大地簡化在 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 語句中運行遞歸查詢所需的代碼。在 SQL Server 的早期版本中,遞歸查詢通常需要使用臨時表、游標和邏輯來控制遞歸步驟流。 

CTE 的基本語法結構如下:

復制代碼 代碼如下:


    WITH expression_name [ ( column_name [,...n] ) ]

    AS

    ( CTE_query_definition )

    --只有在查詢定義中為所有結果列都提供了不同的名稱時,列名稱列表才是可選的。

    --運行 CTE 的語句為:

    SELECT <column_list> FROM expression_name;


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

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

復制代碼 代碼如下:


  with
  cr as
 ?。?
  select * from 表名 where 條件
   )
  --select * from person.CountryRegion --如果加上這句話后面用到cr將報錯
  select * from cr


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

復制代碼 代碼如下:


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的表達式名稱與某個數據表或視圖重名,則緊跟在該CTE后面的SQL語句使用的仍然是CTE,當然,后面的SQL語句使用的就是數據表或視圖。

4. CTE 可以引用自身,也可以引用在同一 WITH 子句中預先定義的 CTE。

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

復制代碼 代碼如下:


COMPUTE 或 COMPUTE BY
ORDER BY(除非指定了 TOP 子句)
INTO
帶有查詢提示的 OPTION 子句
FOR XML
FOR BROWSE


6. 如果將 CTE 用在屬于批處理的一部分的語句中,那么在它之前的語句必須以分號結尾,如下面的SQL所示:

復制代碼 代碼如下:


declare @s nvarchar(3)
set @s = '測試%'; -- 必須加分號
with
t_tree as
(
select * from 表 where 字段 like @s
)
select * from t_tree


------------------------------------操作------------------------------------

上面可能對with as說的有點兒

主站蜘蛛池模板: 于田县| 井陉县| 洪泽县| 石屏县| 阿勒泰市| 阿克苏市| 十堰市| 武山县| 曲阳县| 华安县| 旺苍县| 土默特右旗| 神木县| 尉犁县| 芒康县| 河源市| 咸宁市| 巴南区| 西乌| 吉安市| 五常市| 浪卡子县| 陆丰市| 桓仁| 洪洞县| 会泽县| 扎赉特旗| 冷水江市| 玛多县| 榆树市| 铜鼓县| 弋阳县| 满城县| 陈巴尔虎旗| 巫山县| 东宁县| 桑植县| 长治县| 扶绥县| 鄂托克前旗| 桃源县|