sql-公用表表達式(CTE)

来源:http://www.cnblogs.com/PointBreak/archive/2016/07/10/5656921.html
-Advertisement-
Play Games

定義 公用表表達式(CTE),是一個在查詢中定義的臨時命名結果集將在from子句中使用它。每個CTE僅被定義一次(但在其作用域內可以被引用任意次),並且在該查詢生存期間將一直生存。可以使用CTE來執行遞歸操作。創建的語法是: with <name of you cte>(<column names> ...


定義

公用表表達式(CTE),是一個在查詢中定義的臨時命名結果集將在from子句中使用它。每個CTE僅被定義一次(但在其作用域內可以被引用任意次),並且在該查詢生存期間將一直生存。可以使用CTE來執行遞歸操作。創建的語法是: with <name of you cte>(<column names>) as( <actual query> ) select * from <name of your cte> 使用公共表表達式的好處:
  •      可以定義遞歸公用表表達式(CTE)
  •      當不需要將結果集作為視圖被多個地方引用時,CTE可以使其更加簡潔
  •     GROUP BY語句可以直接作用於子查詢所得的標量列
  •     可以在一個語句中多次引用公用表表達式

非遞歸公用表表達式

非遞歸公用表表達式是查詢結果僅僅一次性返回一個結果集用於外部查詢調用。並不在其定義的語句中調用其自身的CTE。非遞歸公用表表達式的使用方式和視圖以及子查詢一致。

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

 

遞歸公用表表達式

遞歸公用表表達式指的是在CTE內的語句中調用其自身的CTE。

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

  •    基本語句
  •    遞歸語句

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

先建一張表欄目表如下,欄目Id,欄目名稱,欄目的父欄目。

   

現在使用CTE查詢其每個欄目是第幾層欄目的代碼如下:

複製代碼
WITH COL_CTE(Id,Name,ParentId,tLevel )
AS
(
    --基本語句
    SELECT Id,Name,ParentId,0 AS tLevel FROM Col
    WHERE ParentId = 0
    UNION ALL
    --遞歸語句
    SELECT c.Id,c.Name,c.ParentId,ce.tLevel+1 AS tLevel FROM COL 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強大的地方,但是,這要有約束,否則如果無限制遞歸可以會消耗掉非常多的系統資源。還可以通過OPTION(MAXRECURSION n) 限制遞歸的最大次數。

 如將上面的查詢語法改為:

複製代碼
WITH COL_CTE(Id,Name,ParentId,tLevel )
AS
(
    --基本語句
    SELECT Id,Name,ParentId,0 AS tLevel FROM Col
    WHERE ParentId = 0
    UNION ALL
    --遞歸語句
    SELECT c.Id,c.Name,c.ParentId,ce.tLevel+1 AS tLevel FROM COL as c 
    INNER JOIN COL_CTE AS ce 
    ON c.ParentId = ce.Id
)

SELECT * FROM COL_CTE
OPTION(MAXRECURSION 2)  --指定最大遞歸次數為2
複製代碼

 

使用時註意點

with開始前有時候建議加';'符號結束前面的語句。因為with在其他地方有他的含義,加以區別。

總結 

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

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Kubernetes為Google開源的容器管理框架,提供了 Docker容器的誇主機、集群管理、容器部署、高可用、彈性伸縮 等一系列功能;Kubernetes的設計目標包括使容器集群任意時刻都處於用戶期望的狀態,因而建立了一整套集群管理機制:容器自動重啟、自動備份、容器自動伸縮等;Kubernet ...
  • 我會用幾篇博客總結一下在Linux中進程之間通信的幾種方法,我會把這個開頭的摘要部分在這個系列的每篇博客中都打出來 進程之間通信的方式 管道 消息隊列 信號 信號量 共用存儲區 套接字(socket) 進程間通信(三)—信號量傳送門:http://www.cnblogs.com/lenomirei/ ...
  • 一. 準備工作 1. 需要一個Linux宿主系統,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架構上可以運行的其它發行版 二. LFS目標架構 LFS主要支持 AMD/Intel 的 x86(32 位)和 x86_64(64 位) 的目標架構。另外,做一些更改可以讓LF ...
  • 1. 修改官方軟體庫列表 編輯/etc/apt/sources.list,註釋掉原有內容,然後添加下述內容。 2. 執行更新命令並重啟 參考鏈接: 1. Kali Linux, Rolling Edition Released – 2016.1 ...
  • Apache + MySql + Php. 1、安裝Apache Apache可以用下麵的命令來安裝 sudo apt-get install apache2 Apache預設路徑是/var/www/ 其配置文件路徑為: /etc/apache2/ 可以通過:sudo nano /etc/apach ...
  • 郵件告警發現海外工廠一Linux伺服器連接不上,DPA(Database Performance Analyzer)系統也發現其出現問題,ping這台伺服器發現網路不通,聯繫不到當地系統管理員,郵件咨詢後,這個系統管理員也發現有問題,直接重啟了,事後檢查發現日誌message裡面,從10:10分開始... ...
  • redis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。所以[lr]push和[lr]pop命令的演算法時間複雜度都是O(1)。另外list會記錄鏈表的長度。所以llen操作也是O(1).鏈表的最大長度是(2的32次方-1)。我們可以通過push,pop操作從鏈表的頭部或者尾部添 ...
  • 前幾天和群里網友討論一個關於行內鏈接(intra-block chaining)的問題,問題非常有意思,恰好今天有空,順便整理了一下這些知識點。 問題描述:下麵SQL,創建一個超過255列的表(實際為256列),然後插入幾條數據,然後對錶做ANALYZE分析過後,但是發現user_tables的CH... ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...