在T SQL中用佇列來遍歷層級資料

2022-03-03 06:44:43 字數 759 閱讀 3788

前幾天看了《the guru's guide to transact sql》(中文翻譯是transact-sql 權威指南),裡面介紹的乙個查詢是關於層級結構的,處理的方式本質就是佇列,遍歷的結果就像遍歷二叉樹的中先序遍歷,很有趣。

待查詢的表結構如下:

每個層節點都分配乙個唯一的id、節點的名稱、上乙個父節點的id。現在,要做的是查詢指定節點id下所有的子節點,比如對於id為3的節點來說,它的查詢結果id 集為。下面就是關鍵了,寫了個儲存過程,方便重用。

簡單介紹下它的原理,首先,將自身載入到佇列中,初始化佇列。每次都從佇列中彈出乙個值,並把值寫入到結果集中,再把屬於值的子節點塞到佇列中。如果成功塞入,就進入下乙個層級,很類似於遍歷樹形結構使用佇列處理的情況。在處理佇列時,如果發現當前層以沒有元素需要處理了,則返回處理它的上一層,就是語句if exists(select * from #queue where lvl=@lvl) begin。。。end else set @lvl = @lvl-1,也是退出while迴圈的條件。

下面看看執行的結果:

總結一下,tsql是相當靈活的,很多資料結構中的演算法都可以結合表來實現,最後實現的語句雖然複雜了點,不過效率一般較高。發帖辛苦,請支援下。

demo的sql語句:

樹的層序遍歷(靜態佇列實現)

include include typedef struct treetree,tree typedef struct queueque 建立隊 que qcreate 入隊 void enqueue que p,tree s 出隊 tree dequeue que p 判斷空 intisempty...

鏈式佇列實現樹的層序遍歷

前言 鏈式佇列實現樹的層序遍歷的筆記 define crt secure no warnings include include include define maxsize 100 define ok 1 define error 0 dim something struct for writti...

層序遍歷在ExtJs的TreePanel中的應用

今天幫朋友解決了乙個問題 使用extjs的treepanel控制項,如何得到樹的第乙個葉子節點的資訊。原理非常簡單,就是樹的層序遍歷,在遍歷過程中遇到第乙個葉子節點即完成工作。效果如下圖 如下 varcurrentrootnode null 當前選擇的根節點 function nodeclass f...