sql server 公共表達式的簡單應用(cte)

来源:http://www.cnblogs.com/4littleProgrammer/archive/2016/10/16/5966325.html
-Advertisement-
Play Games

一、前言 現在做項目數據訪問基本都會選擇一種orm框架,它以面向對象的形式屏蔽底層的數據訪問形式,讓開發人員更集中在業務處理上,而不是和資料庫的交互上,幫助我們提高開發效率;例如一些簡單的insert、update,我們不需要寫insert into...sql 語句,而是直接new一個實體對象,然 ...


一、前言  

  現在做項目數據訪問基本都會選擇一種orm框架,它以面向對象的形式屏蔽底層的數據訪問形式,讓開發人員更集中在業務處理上,而不是和資料庫的交互上,幫助我們提高開發效率;例如一些簡單的insert、update,我們不需要寫insert into...sql 語句,而是直接new一個實體對象,然後db.Insert(entity),看起來是那麼清爽;像EF這樣比較完善的orm,支持linq語法對資料庫進行訪問,寫起來就更加爽了,有些人甚至認為開發人員可以不用會寫sql語句了...但現實不會讓你工作得那麼輕鬆,作為開發人員對資料庫這一塊的學習還是很有必要的;且不說一些靈活性和效率問題,實際工作中用sql的地方還是非常多的,經常在碼代碼的時候,突然就傳來領導的聲音,那個某某某,你趕緊給我出一份報表,那個誰誰誰,你趕緊給我出一份XXX的數據...很急。

二、使用CTE統計樹形結構

  最近在碼代碼時,領導就來一句:嘿man,你給我統計一下所有xxx產品的信息,要快,那邊在催了...。這裡抽象一下,如下,大概就是找出所有傢具產品的信息,這個分類表包含樹形結構,ParentId為0是某種分類的根,它下麵可能有許多種子節點/葉子節點。這裡需要要找的實際就是一個以傢具為根的樹。

  

測試sql語句:

DECLARE @Product TABLE
(ProductId INT,
 ParentId INT,
 ProductName NVARCHAR(64))

INSERT INTO @Product
VALUES
(1,0,'傢具'),
(2,0,'服裝'),
(3,1,'大型傢具'),
(4,1,'小型傢具'),
(5,2,'男裝'),
(6,2,'女裝'),
(7,3,'床'),
(8,3,'衣櫃'),
(9,3,'沙發'),
(10,4,'電腦桌'),
(11,4,'椅子'),
(12,5,'牛仔褲'),
(13,5,'襯衫'),
(14,6,'裙子')

三、實現

  這種需求實際很多,有經驗的朋友很快就知道怎麼寫,而實際寫法也很簡單。知道這是樹形結構,在腦海裡出現了:自鏈接查詢、子查詢、臨時表、游標、用程式寫代碼遞歸...公共表達式(CTE),OK!CTE的語法如下:

WITH CTE名稱[目標列]
AS
(
<定義CTE的內部查詢>
)
<對CTE進行查詢的外部查詢>

  具體來說,CTE屬於表表達式,另一種表表達式是派生表(子查詢),有時候使用CTE可以優化我們的代碼,使我們的代碼更加簡單、易讀。而且CTE支持遞歸查詢,上面的需求寫法為:

;WITH cte
AS
(SELECT * FROM @Product
  WHERE ProductId = 1
 UNION ALL  
 SELECT p.* FROM @Product p
  INNER JOIN cte t ON p.ParentId = t.ProductId
)
SELECT*FROM cte
 ORDER BY ProductId

四、解析

  CTE的遞歸查詢主要包含兩個部分,定位點成員和遞歸成員。如上面的查詢,UNION ALL 前面的SELECT 就是定位點成員,它是查詢的初始化;UNION ALL下麵的屬於遞歸成員,我們可以遞歸查詢時,每次都為CTE返回上一次的結果集。例如,初始化時,cte結果是ProductId 1,第一次遞歸時,會找到ParentId為1的產品,也就是3,4,並且與上一個結果集UNION ALL得到本次結果集返回,再遞歸時cte就是1,3,4了;而遞歸的結束條件就是本次查詢的結果為空集,此時遞歸結束,並返回最終結果集。

  另外需要說的是,CTE是虛擬的,sql server會為它重新生成查詢語句,直接訪問底層對象;所以在一些性能要求較高的地方,還是要通過執行計劃來判斷是否需要優化,有時候方便是以性能為代價的。


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

-Advertisement-
Play Games
更多相關文章
  • Linux文件和目錄許可權解讀 如何設置Linxu文件和目錄的許可權 字元表示法 1)ls -l:查看所在目錄所有文件的許可權 2)chmod u=r file:把file文件的當前(用戶user)的許可權賦值為可寫模式 3)chmod g=wrx file:把file文件的當前(組gruop)的許可權賦值為 ...
  • 在IOS開法中經常會遇到鍵盤遮擋屏幕的事情(比如輸入賬號密碼驗證碼等等),就使得原本都不大的屏幕直接占了一半甚至更多的位置,這倒無所謂,關鍵是擋住了下麵的按鈕。這樣的話按鈕的事件也就觸發不了,最好的解決辦法就是當輸入這些信息的時候讓整個屏幕上移一個鍵盤的位置,或者上移到指定的位置。 首先一般輸入的話 ...
  • 首先吹一下意圖:切割字元串是因為在資料庫中存圖片地址時,可能一件商品對應有多張圖片。那麼我們可以建一個商品表(goods)和一個圖片表(goods_image),然後讓圖片表的id作為商品表的外鍵,實現一對多的關聯。 但是想到建表一個路徑一個路徑的存,數據也蠻多的,然後既然可以在商品表中添加一個欄位 ...
  • 控制台列印的信息如下 解決辦法: Xcode8裡邊 Edit Scheme... -> Run -> Arguments, 在Environment Variables裡邊添加 OS_ACTIVITY_MODE = disable 步驟1. 步驟2. 步驟3. 結束設置 ...
  • 調整圖片大小的時候按下:option鍵讓讓控制項跟內容一樣大:command+= http://www.cr173.com/html/21801_1.html 一、關於運行調試1、運行,停止,都在工具欄的Product里。Command + R 運行。Command + . 停止 2、F6單步調試、F ...
  • Rocksdb是一個kv引擎,由facebook團隊基於levelDB改進而來,Rocksdb採用LSM-tree存儲數據,良好的讀寫特性以及壓縮特性使得其非常受歡迎。此外,Rocksdb引擎作為插件已經集成在facebook維護的MySQL分支,用戶可以通過SQL來訪問rocksDB。本文主要通過 ...
  • PL/SQL PL/SQL 簡介 每一種資料庫都有這樣的一種語言,PL/SQL 是在Oracle裡面的一種編程語言,在Oracle內部使用的編程語言。我們知道SQL語言是沒有分支和迴圈的,而PL語言是為了補充SQL語言的,是帶有了分支和迴圈的語言。 PL/SQL 語法 基本數據類型聲明 declar... ...
  • 目錄 環境準備 創建hadoop用戶 更新apt 配置SSH免密登陸 安裝配置Java環境 安裝Hadoop Hadoop單機/偽分佈配置 單機Hadoop 偽分佈Hadoop 啟動Hadoop 停止Hadoop 目錄 作者: vincent_zh時間:2016-10-16 出處:http://ww ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...