[轉(zhuǎn)帖]sqlserver-用 WITH 和 UNION(或者UNION ALL)實現(xiàn)遞歸查詢
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
WITH WITH提供了一種撰寫用于更復(fù)雜查詢輔助語句的方法。這些通常被稱為公用數(shù)據(jù)表表示式或CTE(Common Table Expressions)的宣告可以被想成是定義僅存在于一個查詢中的臨時數(shù)據(jù)表。WITH子句中的每個輔助語句都可以是select、insert、update或delete;并且WITH子句本身附加到select、insert、update或delete的主語句。 select in WITH select中WITH的基本價值是將復(fù)雜的查詢分解為較為簡單的部分。例子如下: WITH regional_sales AS( select region,SUM(amount)AS total_sales from orders GROUP BY region ),top_regions AS( select region from regional_sales where total_sales >(select SUM(total_sales)/10 from regional_sales) ) select region, product, SUM(quantity)AS product_units, SUM(amount)AS product_sales from orders where region IN(select region from top_regions) GROUP BY region,product; 其中僅顯示最上層銷售區(qū)域中的每個產(chǎn)品的銷售總計。WITH子句定義了兩個名為regional_sales和top_regions的輔助語句,其中top_size使用region_sales的輸出,top_regions的輸出在主select語句中使用。這個例子本來可以不用WITH編寫,但是我們需要兩層的select子查詢。按照這種方式更容易一些。 遞歸循序 一個非常簡單的例子是這個查詢來從1到100的整數(shù)求和: WITH t3 AS ( select 0 as val union ALL select val+1 as val from t3 where val <100 ) select sum(val) as sum from t3 結(jié)果: 遞歸查詢通常用于處理分層或樹狀結(jié)構(gòu)的數(shù)據(jù)。 一個實用的例子是,一種多層級結(jié)構(gòu)的部門結(jié)構(gòu),要查詢某部門與該部門底下的所有子部門,和子部門下的子部門的部門ID和部門名稱。 一張簡單的部門表如下: 有兩種情況: 1.有卡層次,例如卡最多三層,部門1->部門1.1->部門1.1.1 這種情形的可以選擇left jion的方式: 2.沒有卡層, 在創(chuàng)建部門的時候不進(jìn)行層級的卡控,這個時候是沒有辦法選擇用left join來實現(xiàn),可以考慮用遞歸的方式,我們這時可使用WITH: 這樣就優(yōu)美的完成了遞歸循環(huán)?。?/p> 總結(jié):前兩周第一次看到這種寫法的時候,確實被驚艷到了!覺得很酷!不過一直都沒有在實際中用到,在前幾天剛好碰到有個不卡層級的部門結(jié)構(gòu)需要查詢部門與所有子部門的一些資料,腦袋就突然想到這個寫法!最后完美的實現(xiàn)功能,所以想開通第一篇博客來記錄下來! 參考: 遞迴查詢(Common Table Expressions) ———————————————— 版權(quán)聲明:本文為CSDN博主「悅千」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/Ryomaku/article/details/100068078 該文章在 2023/5/29 10:44:17 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |