遞迴查詢解決樹形資料很管用
sql server引入公用表表示式(cte)可建立遞迴查詢
首先,檢視了一下msdn關於cte的介紹:
了解到如下資訊:
cte 的基本語法結構如下:
with expression_name [ ( column_name [,...n] ) ]
as( cte_query_definition )
cte的優點是可以引用自身,從而可以建立遞迴cte。遞迴查詢通常返回分層資料。
● 遞迴 cte 由下列三個元素組成:
1. 例程的呼叫。
遞迴 cte 的第乙個呼叫包括乙個或多個由 union all、union、except 或 intersect 運算子聯接的 cte_query_definitions。由於這些查詢定義形成了 cte 結構的基準結果集,所以它們被稱為「定位點成員」。
cte_query_definitions 被視為定位點成員,除非它們引用了 cte 本身。所有定位點成員查詢定義必須放置在第乙個遞迴成員定義之前,而且必須使用 union all 運算子聯接最後乙個定位點成員和第乙個遞迴成員。
2. 例程的遞迴呼叫。
遞迴呼叫包括乙個或多個由引用 cte 本身的 union all 運算子聯接的 cte_query_definitions。這些查詢定義被稱為「遞迴成員」。
3. 終止檢查。
終止檢查是隱式的;當上乙個呼叫中未返回行時,遞迴將停止。
● 偽**和語義
遞迴 cte 結構必須至少包含乙個定位點成員和乙個遞迴成員。以下偽**顯示了包含乙個定位點成員和乙個遞迴成員的簡單遞迴 cte 的元件。
with cte_name ( column_name [,...n] )as(
cte_query_definition –- anchor member is defined.
union all
cte_query_definition –- recursive member is defined referencing cte_name.
)-- statement using the cte
select *
from cte_name
● 遞迴執行的語義如下:
1. 將 cte 表示式拆分為定位點成員和遞迴成員。
2. 執行定位點成員,建立第乙個呼叫或基準結果集 (t0)。
3. 執行遞迴成員,將 ti 作為輸入,將 ti+1 作為輸出。
4. 重複步驟 3,直到返回空集。
5. 返回結果集。這是對 t0 到 tn 執行 union all 的結果。
借用該文的例子:
create table menu
(name nvarchar(50) not null
primary key ,
senior nvarchar(50) null
);insert into menu
values ( '檔案', null ),
( '新建', '檔案' ),
( '專案', '新建' ),
( '使用當前連線查詢', '新建' );
建立如上表,並新增樹形資料
我們希望對資料形成乙個樹形的查詢,這時就需要使用遞迴sql
with temp
as ( select name ,
senior ,
0 as level
from menu
where senior is null
union all
select menu.name ,
menu.senior ,
level + 1
from dbo.menu
inner join temp on dbo.menu.senior = temp.name
)select name as '名稱' ,
senior as '子項' ,
temp.level as '層級'
from temp
這是我的寫法,查詢結果如下:
我們可以發現,通過定位點成員,也就是這句sql,
select name ,
senior ,
0 as level
from menu
where senior is null
我們可以查詢這個樹的葉子節點,就是這條資料
然後通過遞迴成員,就是這段sql,
select menu.name ,
menu.senior ,
level + 1
from dbo.menu
inner join temp on dbo.menu.senior = temp.name
呼叫了這個名為temp的公用表,實現的遞迴。通過在menu表中找到滿足條件senior為temp的name的資料。對於本例,簡單的可以理解,找到所有senior=『檔案』的資料。
結合例項,可以較好的理解遞迴寫法。
簡單 sql 分頁學習
有關分頁 sql 的資料很多,有的使用儲存過程,有的使用游標。本人不喜歡使用游標,我覺得它耗資 效率低 使用儲存過程是個不錯的選擇,因為儲存過程是經過預編譯的,執行效率高,也更靈活。先看看單條 sql 語句的分頁 sql 吧。方法1 適用於 sql server 2000 2005 select t...
簡單幾招捕獲Oracle遞迴SQL呼叫源頭
摘要 作者介紹 蔣健,雲趣網路科技聯合創始人,11g ocm,多年oracle設計 管理及實施經驗,精通資料庫優化,oracle cbo及並行原理,曾為多個行業的客戶的 oracle 系統實施小型機到 x86跨平台遷移和資料庫優化服務。作者介紹 蔣健,雲趣網路科技聯合創始人,11g ocm,多年or...
簡單學習SQL語句規則
create database db2 建立資料夾,名字叫db2 create database db2 default charset utf8 建立資料夾,utf 8格式 show databases 顯示資料夾 drop database db1 刪除資料夾 use db2 使用哪個資料夾 s...