3階層構造で一番上の親を参照する前提以下のようなスキーマのテーブルを前提とする。 idが主キーで、parent_idはそのレコードの親のidを表す。parent_idが0の場合は、そのレコードが一番上の親という意味になる。この階層は最大3階層とする。
上のテーブルの階層構造は以下のようになる。
SQLこのテーブルについて、それぞれのレコードの一番上の親を参照するには以下のようにする。 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;
参考PostgreSQL8.4以上なら再帰クエリを使うと良い。 |
|