【SQL Server】親子階層を表現する

方法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/1265299001
http://d.hatena.ne.jp/odashinsuke/20100607/1275916902
http://d.hatena.ne.jp/taedium/20060207/p1