分類是在一般系統最常見的信息組織方式,有單級的分類,二級的分類,還有無限制級的分類。
當然我們給博客貼上分類的時候只要join下就可以找到分類的名稱。
但是我們在做導航或者選擇分類的時候往往涉及到分類的級聯查詢。下面就是說如何用sql查詢這樣的分類信息。
-- 建立分類表 CREATE TABLE t_category ( ID INT IDENTITY(1,1) PRIMARY KEY, Name VARCHAR(40) NOT NULL, ParentID INT DEFAULT(-1) )
-- 插入一些測試數據 INSERT INTO t_category(name) VALUES('計算機類') INSERT INTO t_category(name) VALUES('吃的類') INSERT INTO t_category(name, parentid) VALUES('linux', 1) INSERT INTO t_category(name, parentid) VALUES('python', 1) INSERT INTO t_category(name, parentid) VALUES('oracle', 1) INSERT INTO t_category(name, parentid) VALUES('水果', 2) INSERT INTO t_category(name, parentid) VALUES('主食', 2) INSERT INTO t_category(name, parentid) VALUES('米飯', 7) INSERT INTO t_category(name, parentid) VALUES('面食', 7) INSERT INTO t_category(name, parentid) VALUES('django', 4) INSERT INTO t_category(name, parentid) VALUES('tornado', 4)
-- 問題一:如何檢索一個分類的路線 即:父->子->子->子 獲得這樣一個路徑 -- 查詢django分類的路徑 結果應該為計算機類->python->django WITH ctetable(id,name,pid) as ( SELECT ID,name, parentid FROM t_category WHERE ID = 10 UNION ALL SELECT p2.id, p2.name, parentid FROM ctetable JOIN t_category p2 ON p2.id =ctetable.pid ) SELECT * FROM ctetable ORDER BY ID
-- 輸出結果 1, '計算機類', -1 4, 'python', 1 10, 'django', 4
主要是應用了sql2005的common table expression特性。為我們提供了方便的查詢方式。在cte表中可以自應用
參考地址:http://msdn.microsoft.com/en-us/library/ms175972(v=sql.90).aspx