* 3階層構造で一番上の親を参照する [#i4dfbaf2]
** 前提 [#i4c2b395]
以下のようなスキーマのテーブルを前提とする。
idが主キーで、parent_idはそのレコードの親のidを表す。parent_idが0の場合は、そのレコードが一番上の親という意味になる。この階層は最大3階層とする。
|id(PK)|parent_id|h
|1|0|
|2|0|
|3|2|
|4|3|
|5|0|
|6|5|
上のテーブルの階層構造は以下のようになる。
-1
-2
--3
---4
-5
--6
** SQL [#sfc03f05]
このテーブルについて、それぞれのレコードの一番上の親を参照するには以下のようにする。
SELECT
COALESCE(
CASE WHEN t3.parent_id = 0 THEN NULL ELSE t3.parent_id END,
CASE WHEN t2.parent_id = 0 THEN NULL ELSE t2.parent_id END,
CASE WHEN t1.parent_id = 0 THEN t1.id ELSE t1.parent_id END) AS top,
t1.id
FROM
tbl t1
LEFT OUTER JOIN
tbl t2
ON
t1.parent_id = t2.id
LEFT OUTER JOIN
tbl t3
ON
t2.parent_id = t3.id
ORDER BY top;
** 参考 [#hd2d7888]
PostgreSQL8.4以上なら再帰クエリを使うと良い。