【轉】https://www.cnblogs.com/lgx5/p/6040940.htmlhtml
在sqlserver2005以前,要實現遞歸功能比較麻煩,好比可能會要用到臨時表與while語句來循環。自sqlserver2005以後,新增了with as功能語法,即 公用表達式(CTE),讓遞歸實現起來變的簡單了。sql
本章咱們主要演示如何利用with as功能實現一個簡單的遞歸功能。
在這以前先看一下cte的語法:express
[ 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 的任何引用都會使用公用表表達式,而不使用基對象。sqlserver
column_name:
在公用表表達式中指定列名。在一個 CTE 定義中不容許出現重複的名稱。指定的列名數必須與CTE_query_definition結果集中列數匹配。只有在查詢定義中爲全部結果列都提供了不一樣的名稱時,列名稱列表纔是可選的。spa
CTE_query_definition:
指定一個其結果集填充公用表表達式的 SELECT 語句。除了 CTE 不能定義另外一個 CTE 之外,CTE_query_definition的 SELECT 語句必須知足與建立視圖時相同的要求。
若是定義了多個 CTE_query_definition,則這些查詢定義必須用下列一個集合運算符聯接起來:UNION ALL、UNION、EXCEPT 或 INTERSECT。server
--開始實例演示--htm
先建立一個倉庫表,表名爲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
)
而後往該表插入演示數據:blog
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 allselect 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後,會發現它會給咱們的工做帶來很大的便利.