方法1:WITHを使用する
* SQL Server2005以降で使用可能
サンプル
* 以下の記事を参照のこと
WITH 句 ~共通テーブル式~
http://blogs.yahoo.co.jp/dk521123/29639816.html方法2:WITHおよびHierarchyID データ型を使用する
* SQL Server2008以降で使用可能
サンプル
WITH cte (path, [Id], [name], [bossId], [Hierarchy]) AS ( -- 上司 SELECT HierarchyID::GetRoot() AS root, [Id], [name], [bossId], 0 FROM [Emp] WHERE [Id]= 1001 UNION ALL -- 部下(再帰) SELECT CAST(Main.path.ToString() + CAST(Sub.[Id] AS varchar(20)) + '/' AS HierarchyID ), Sub.[Id], Sub.[name], Sub.[bossId], Main.Hierarchy + 1 FROM [Emp] AS Sub INNER JOIN cte AS Main ON Sub.[bossId] = Main.[Id] ) SELECT path.GetLevel() AS HierarchyLevel, path.ToString() AS HierarchyIdPath, * FROM cte
参考文献
http://d.hatena.ne.jp/matu_tak/20100205/1265299001http://d.hatena.ne.jp/odashinsuke/20100607/1275916902
http://d.hatena.ne.jp/taedium/20060207/p1