1. 程式人生 > >Sql Server 公用表達式(CTE)

Sql Server 公用表達式(CTE)

使用 cnblogs 技術 ESS 臨時 tro http 都是 let

簡介

對於select查詢語句來說,通常情況下,為了使T-SQL代碼更加簡潔和可續,在一個查詢中引入另外的結果集都是通過視圖而不是子查詢來進行分解的,但是,視圖是作為系統對象存在數據庫中,那對於結果集僅僅需要在存儲過程或是用戶自定義函數中使用一次的時候,使用視圖就顯得有些奢侈了。

公用表表達式(Common Table Expression)是SQL SERVER 2005版本之後引入的一個特性.CTE可以看作是一個臨時的結果集,可以在接下來的一SELECT,INSERT,UPDATE,DELETE,MERGE語句中被多次引用。使用公用表達式可以讓語句更加清晰簡練.

公用表表達式其實提供的功能和視圖差不多,但是它不像視圖一樣把sql語句保存在我們的數據庫裏面。雖然CTE不是必需的,但是它可以為提高sql的可讀性

微軟官方給的使用CET的優勢:

  • 編寫一個遞歸查詢(類似樹查詢)
  • 使用要使用一個類似視圖的功能,但是又不想把這個查詢sql語句的定義保存在數據庫
  • 要引用一個返回數據sql語句多次,只需要定義一次。
公用表表達式(CTE)的定義

公用表達式的定義非常簡單,只包含三部分:

  1. 公用表表達式的名字(在WITH之後)
  2. 所涉及的列名(可選)
  3. 一個SELECT語句(緊跟AS之後)
  WITH expression_name [(column_name [,...n] )]
  AS
  ( 
    cte_query_definition
  )

按照是否遞歸,可以將公用表(CTE)表達式分為遞歸公用表表達式和非遞歸公用表表達式.
非遞歸公用表表達式(CTE)

非遞歸公用表表達式(CTE)是查詢結果僅僅一次性返回一個結果集用於外部查詢調用。並不在其定義的語句中調用其自身的CTE

非遞歸公用表表達式(CTE)的使用方式和視圖以及子查詢一致

比如一個簡單的非遞歸公用表表達式:

  技術分享圖片
   公用表表達式的好處之一是可以在接下來一條語句中多次引用:

with cte_name
as
(
  select * from Sys_Log
)
select * from cte_name a inner join cte_name b on a.f_id=b.f_id

由於CTE只能在接下來一條語句中使用,如果使用多次會提升cte名稱無效

技術分享圖片

因此,當需要接下來的一條語句中引用多個CTE時,可以定義多個,中間用逗號分隔

技術分享圖片

with cte_name1
as
(
  select * from Sys_Log
),
cte_name2
as
(
  select * from Sys_Log
)
select * from cte_name1
UNION
select * from cte_name2

技術分享圖片

遞歸公用表表達式(CTE)

對於遞歸公用表達式來說,實現原理也是相同的,同樣需要在語句中定義兩部分:

  • 基本語句
  • 遞歸語句

在SQL這兩部分通過UNION ALL連接結果集進行返回:

比如我現在有一張表 裏面存的是樹形結構,學院院系>專業>年紀>班級

如何根據班級id查找他的所以父極了?

技術分享圖片

也可以根據父級編號遞歸查詢它所以的下級編號,

技術分享圖片

這就是CTE的便利

總結

CTE是一種十分優雅的存在。CTE所帶來最大的好處是代碼可讀性的提升,這是良好代碼的必須品質之一。使用遞歸CTE可以更加輕松愉快的用優雅簡潔的方式實現復雜的查詢。

Sql Server 公用表達式(CTE)