從SQL Server2005開始,可以直接通過CTE來支持遞歸查詢。CTE(Common Table Expression,公用表表達式)是一個在查詢中定義的臨時命名結果集,這個結果集可以被后面緊跟着的from子句使用。每個CTE僅能被定義一次,但是在其作用域內可以被引用多次,並且在該查詢生命周期中一直生存,因此可以使用CTE來執行遞歸操作。
假設有一個cb表,表中有id、pid和name三個字段,其中pid是其父節點的id,如果是頂級節點,則pid為null。
表中有三條記錄:
id | pid | name |
001 | 頂級/一級節點 | |
001001 | 001 | 二級節點 |
001001001 | 001001 | 三級節點 |
通過子節點遞歸查詢父節點:
with subqry(id, pid, name) as ( select cb.id, cb.pid, cb.name
from cb where cb.id = '001001001' union all select cb.id, cb.pid, cb.name
from cb, subqry where cb.id = subqry.pid ) select distinct * from subqry
這樣,就能查詢出id為001001001的子節點及其上所有父節點。
通過父節點遞歸查詢子節點:
with subqry(id, pid, name) as ( select cb.id, cb.pid, cb.name from cb where cb.id = '001' union all select cb.id, cb.pid, cb.name from cb, subqry where cb.pid = subqry.id ) select distinct * from subqry
這樣,就能查詢出id為001的父節點及其下所有子節點。
另外的,在向下查詢子節點的時候還有一個技巧可以查詢出層級。因為遞歸的原因,每一次遞歸層級就加1,就可以加一個初始值為0的層級字段level,每次遞歸加1就可以查詢出層級了。
"世界是真的,付出的都值得。"