<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在編寫T-SQL程式碼時,往往需要臨時儲存某些結果集。前面我們已經廣泛使用和介紹了兩種臨時儲存結果集的方法:臨時表和表變數。除此之外,還可以使用公用表表示式的方法。
公用表表示式(Common Table Expression)是SQL Server2005版本的引入的一個特性。CTE可以看組是一個臨時的結果集,可以再接下來來的一個SELECT,INSERT,UPDATE,DELETE,MERGE語句中多次參照。
使用公用表示式CTE可以讓語句更加清晰簡練。與公用表示式作用類似的還有臨時表和表變數。下面給出三種方法的對比。
根據微軟對CTE好處的描述,可以歸結為四點:
WITH AS-做子查詢部分(subquery factoring)。
它用於定義一個SQL片段,該片段會被是整個SQL語句所用到。如果WITH AS所以定的表名被呼叫兩次以上,則優化器會自動將WITH AS所獲取的資料放入臨時表裡,如果只是被呼叫一次,則不會。
可以通過materialize將WITH AS短語裡的資料強制放入全域性臨時表裡。
WITH AS可以被緊跟著的一條SQL語句所使用多次,但不能被緊跟著的多條SQL語句使用。
WITH B AS ( SELECT * FROM xxx WHERE Id > 5 ) SELECT * FROM B
CTE的定義語法如下,主要包括3個部分。
WITH expression_name [(column_name [,...n] )] AS ( cte_query_definition )
按照是否遞迴,可以將公用表(CTE)表示式分為遞迴公用表表示式和非遞迴公用表表示式.
非遞迴公用表表示式(CTE)是查詢結果僅僅一次性返回一個結果集用於外部查詢呼叫。並不在其定義的語句中呼叫其自身的CTE。
非遞迴公用表表示式(CTE)的使用方式和檢視以及子查詢一致。
比如一個簡單的非遞迴公用表表示式:
WITH CTE_Test AS ( SELECT * FROM Person_1 ) SELECT * FROM CTE_Test
公用表表示式的好處之一是可以在接下來一條語句中多次參照:
with CTE_Test as (select * from Person_1) select * from CTE_Test as a --第一次參照 inner join CTE_Test as b --第二次參照 on a.Id=b.Id order by a.Id desc;
雖然以上參照了多次,但是隻是一條語句,所以可以正常執行。
如果多條語句參照,如下面這樣,是會報錯的。
with CTE_Test as (select * from Person_1) select * from CTE_Test; select * from CTE_Test;
輸出結果如下:
由於CTE只能在接下來一條語句中使用,因此,當需要接下來的一條語句中參照多個CTE時,可以定義多個,中間用逗號分隔。下面是一次定義多個CTE的例子:
with CTE_Test1 as (select * from Person_1), CTE_Test2 as (select * from Person_2) select * from CTE_Test1 union select * from CTE_Test2;
結果如下:
對於遞迴公用表示式來說,只需要在語句中定義兩部分:
先建一張表欄目表如下,欄目Id,欄目名稱,欄目的父欄目。
現在使用CTE查詢其每個欄目是第幾層欄目的程式碼如下:
declare @table1 table(id int, Name varchar(10), ParentId int); insert into @table1(id, Name, ParentId) values(1, '國內新聞', 0), (2, '廣東新聞', 1), (3, '廣州新聞', 2), (4, '天河新聞', 3), (5, '山東新聞', 1), (5, '青島新聞', 5); select * from @table1; with COL_CTE(Id, Name, ParentId, tLevel) as ( --基本語句 select id, Name, ParentId, 0 as tLevel from @table1 where ParentId=0 union all --遞迴語句 select c.id, c.Name, c.ParentId, ce.tLevel+1 as tLevel from @table1 as c inner join COL_CTE as ce --遞迴呼叫 on c.ParentId=ce.Id) select * from COL_CTE;
輸出結果如下:
0表示頂級欄目。1就是1級欄目。語法非常優雅。就一個SELECT * FRON COL_CTE。這正是CTE強大的地方,但是,這要有約束,否則如果無限制遞迴可以會消耗掉非常多的系統資源。下面來看看如何限制遞迴的最大次數。
如將上面的查詢語法改為:
WITH COL_CTE(Id,Name,ParentId,tLevel ) AS ( --基本語句 SELECT Id,Name,ParentId,0 AS tLevel FROM @table1 WHERE ParentId = 0 UNION ALL --遞迴語句 SELECT c.Id,c.Name,c.ParentId,ce.tLevel+1 AS tLevel FROM @table1 as c INNER JOIN COL_CTE AS ce ON c.ParentId = ce.Id ) SELECT * FROM COL_CTE OPTION(MAXRECURSION 2) --指定最大遞迴次數為2
我們知道在上面的查詢中,要查到天河區新聞最少要遞迴3次,但是現在只遞迴2次,執行是什麼結果呢?
提示資訊如下:
訊息 530,級別 16,狀態 1,第 1 行 語句被終止。完成執行語句前已用完最大遞迴 2。
CTE是一種十分優雅的存在。CTE所帶來最大的好處是程式碼可讀性的提升,這是良好程式碼的必須品質之一。使用遞迴CTE可以更加輕鬆愉快的用優雅簡潔的方式實現複雜的查詢。
到此這篇關於SQL Server中T-SQL公用表表示式(CTE)的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45