在sql server中利用with as實現遞歸功能


【轉】https://www.cnblogs.com/lgx5/p/6040940.html

 

在sqlserver2005之前,要實現遞歸功能比較麻煩,比如可能會要用到臨時表與while語句來循環。自sqlserver2005之后,新增了with as功能語法,即 公用表達式(CTE),讓遞歸實現起來變的簡單了。

本章我們主要演示如何利用with as功能實現一個簡單的遞歸功能。
在這之前先看一下cte的語法:

[ WITH <common_table_expression > [ ,...n ] ]
<common_table_expression >::=
expression_name [ ( column_name [ ,...n ] ) ]
AS
( CTE_query_definition ) 
參數說明:
expression_name:
公用表表達式的有效標識符。 expression_name 必須與在同一 WITH <common_table_expression > 子句中定義的任何其他公用表表達式的名稱不同,但 expression_name 可以與基表或基視圖的名稱相同。在查詢中對 expression_name 的任何引用都會使用公用表表達式,而不使用基對象。

column_name:
在公用表表達式中指定列名。在一個 CTE 定義中不允許出現重復的名稱。指定的列名數必須與CTE_query_definition結果集中列數匹配。只有在查詢定義中為所有結果列都提供了不同的名稱時,列名稱列表才是可選的。

CTE_query_definition:
指定一個其結果集填充公用表表達式的 SELECT 語句。除了 CTE 不能定義另一個 CTE 以外,CTE_query_definition的 SELECT 語句必須滿足與創建視圖時相同的要求。
如果定義了多個 CTE_query_definition,則這些查詢定義必須用下列一個集合運算符聯接起來:UNION ALL、UNION、EXCEPT 或 INTERSECT。

--開始實例演示--

先創建一個倉庫表,表名為Storage_Depository,該表有三個字段:DID(倉庫編號),DName(倉庫名稱),PID(父倉庫編號).
通過這樣一個簡單表,就可以將所有倉庫信息,通過DID與PID字段來創建一個樹型結構。
創建表的sql語句:

Create table Storage_Depository
(
DID varchar(50) not null primary key,
DName varchar(50) not null,
PID varchar(50) null
)
然后往該表插入演示數據:

insert into Storage_Depository(DID,DName,PID) 
select 'A','A倉庫',null 
union all
select 'A-1','A-1倉庫','A' 
union all
select 'A-2','A-2倉庫','A' 
union all
select 'A-1-1','A-1-1倉庫','A-1' 
union all
select 'B','B倉庫',null 
從上面的數據可以看的出來,A的子倉為A-1與A-2倉,而A-1-1為A-1的子倉,B倉是一個獨立的倉庫,與A倉平級。
下面,我們通過with as功能,查出A倉下面的所有子倉:

with w_Storage_Depository as
(
select DID,DName,PID from Storage_Depository where DID='A'
union all
select A.DID,A.DName,A.PID from Storage_Depository A,w_Storage_Depository B where A.PID=B.DID
)
select * from w_Storage_Depository
代碼很簡短,也非常容易讓人理解.

反過來,比如我們要查出A-1-1倉的所有上級倉,稍稍改一下上面的sql語句就可以了:

with w_Storage_Depository as
(
select DID,DName,PID from Storage_Depository where DID='A-1-1'
union all
select A.DID,A.DName,A.PID from Storage_Depository A,
w_Storage_Depository B where A.DID=B.PID
)
select * from w_Storage_Depository
很簡單吧,熟練使用CTE后,會發現它會給我們的工作帶來很大的便利.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM