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

來源:互聯網
上載者:User

標籤:nio   cep   rom   建立表   列表   express   獨立   工作   intersect   

在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後,會發現它會給我們的工作帶來很大的便利.

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.