Yanor.net/
Wiki
Blog
GitHub
Sandbox
開始行:
* 3階層構造で一番上の親を参照する [#i4dfbaf2]
** 前提 [#i4c2b395]
以下のようなスキーマのテーブルを前提とする。
idが主キーで、parent_idはそのレコードの親のidを表す。pare...
|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_...
CASE WHEN t2.parent_id = 0 THEN NULL ELSE t2.parent_...
CASE WHEN t1.parent_id = 0 THEN t1.id ELSE t1.parent...
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以上なら再帰クエリを使うと良い。
終了行:
* 3階層構造で一番上の親を参照する [#i4dfbaf2]
** 前提 [#i4c2b395]
以下のようなスキーマのテーブルを前提とする。
idが主キーで、parent_idはそのレコードの親のidを表す。pare...
|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_...
CASE WHEN t2.parent_id = 0 THEN NULL ELSE t2.parent_...
CASE WHEN t1.parent_id = 0 THEN t1.id ELSE t1.parent...
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以上なら再帰クエリを使うと良い。
ページ名: