日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

查询树形的根节点

發布時間:2024/1/3 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 查询树形的根节点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據庫環境:SQL SERVER 2005

  有一個test表,其表結構及數據如下圖1。其中,id是主鍵,mid是當前節點,pid是父節點。

要求:查出每個節點的根節點,如圖2所示。

  分析:這需求實際上樹形查詢的擴展,我們可以先找到根節點,從根節點往下找到分支節點,

再從分支節點往下找葉子節點。

  1.數據準備

WITH    x0
          AS ( SELECT   1 AS id ,
                        'A' AS mid ,
                        'B' AS pid
               UNION ALL
               SELECT   2 AS id ,
                        'B' AS mid ,
                        'C' AS pid
               UNION ALL
               SELECT   3 AS id ,
                        'C' AS mid ,
                        'N' AS pid
               UNION ALL
               SELECT   4 AS id ,
                        'D' AS mid ,
                        'E' AS pid
               UNION ALL
               SELECT   5 AS id ,
                        'E' AS mid ,
                        'G' AS pid
               UNION ALL
               SELECT   6 AS id ,
                        'G' AS mid ,
                        'K' AS pid
               UNION ALL
               SELECT   7 AS id ,
                        'J' AS mid ,
                        'H' AS pid
             )

View Code

  2.找到根節點

,/*找到沒有父節點的節點,即根節點*/
        x1
          AS ( SELECT   t1.* ,
                        t2.mid AS root_flag
               FROM     x0 t1
                        LEFT JOIN x0 t2 ON t2.mid = t1.pid
             )

View Code

  3.遞歸查詢

,/*從根節點往下遞歸*/
        x2 ( id, mid, pid, rid, way )
          AS ( SELECT   t1.id ,
                        t1.mid ,
                        t1.pid ,
                        CONVERT(VARCHAR(10), t1.pid) AS rid ,
                        CONVERT(VARCHAR(20), t1.pid + ',' + t1.mid) AS way
               FROM     x1 t1
               WHERE    t1.root_flag IS NULL
               UNION ALL
               SELECT   t1.id ,
                        t1.mid ,
                        t1.pid ,
                        CONVERT(VARCHAR(10), LEFT(t2.way,
                                                  CHARINDEX(',', t2.way) - 1)) AS rid ,
                        CONVERT(VARCHAR(20), t2.way + ',' + t1.mid) AS way
               FROM     x1 t1
                        INNER JOIN x2 t2 ON t2.mid = t1.pid
             )
    SELECT  id ,
            mid ,
            pid ,
            rid
    FROM    x2
    ORDER BY id

View Code

  綜合整個SQL,test表總共被掃描了4次才實現結果。期待有大神提出更好的解決方法。

總結

以上是生活随笔為你收集整理的查询树形的根节点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。