在T-SQL中用隊列來遍歷層級數據


    前幾天看了《The Guru's Guide To Transact SQL》(中文翻譯是Transact-SQL 權威指南),里面介紹的一個查詢是關於層級結構的,處理的方式本質就是隊列,遍歷的結果就像遍歷二叉樹的中先序遍歷,很有趣。

待查詢的表結構如下:

    每個層節點都分配一個唯一的ID、節點的名稱、上一個父節點的ID。現在,要做的是查找指定節點ID下所有的子節點,比如對於ID為3的節點來說,它的查詢結果ID 集為{5,6,7,8,9,10,11,12,13}。下面就是關鍵了,寫了個存儲過程,方便重用。

簡單介紹下它的原理,首先,將自身加載到隊列中,初始化隊列。每次都從隊列中彈出一個值,並把值寫入到結果集中,再把屬於值的子節點塞到隊列中。如果成功塞入,就進入下一個層級,很類似於遍歷樹形結構使用隊列處理的情況。在處理隊列時,如果發現當前層以沒有元素需要處理了,則返回處理它的上一層,就是語句IF EXISTS(SELECT * FROM #queue where lvl=@lvl) BEGIN。。。END ELSE SET @lvl = @lvl-1,也是退出WHILE循環的條件。

下面看看執行的結果:

總結一下,TSQL是相當靈活的,很多數據結構中的算法都可以結合表來實現,最后實現的語句雖然復雜了點,不過效率一般較高。發帖辛苦,請支持下。

demo的sql語句:http://files.cnblogs.com/ProJKY/TSQLQueue.zip


免責聲明!

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



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