sql server使用cte遞歸查詢獲取樹形的父節點/子節點


從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就可以查詢出層級了。

 

"世界是真的,付出的都值得。"


免責聲明!

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



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