[pgsql-jp: 40439] Re: 階層問い合わせの使い方について

kuma @ fgy.co.jp kuma @ fgy.co.jp
2010年 10月 6日 (水) 14:36:07 JST


お世話になります、大熊です。

以前、表題の件でご質問させて頂いた時に8.4 以降であればと言う事で以下のよ
うに教えていただきましたが、データの取得順を階層毎(?)にするにはどのよ
うにすればよろしいのでしょうか?
connectby であれば
  1500 | 1000  | お菓子
  1510 | 1500  | 和菓子
  1511 | 1510  | 生和菓子
  1512 | 1510  | まんじゅう
  1513 | 1510  | ようかん
  1514 | 1510  | せんべい
  1515 | 1510  | 最中
  1520 | 1500  | 洋菓子
  1521 | 1520  | プリン
  1522 | 1520  | ゼリー
  1523 | 1520  | ケーキ
  1524 | 1520  | パイ
  1525 | 1520  | カステラ
のようになるのですが

> connectby 関数はほとんど使ったことがないので connectby 関数でどう書く
> かはすぐには分かりませんが、8.4 以降であれば再帰問い合わせを使って以下
> のように書けると思います。
> 
> =# WITH RECURSIVE t (key, key_p, name) AS (
> (#     SELECT g.key, g.key_p, g.name
> (#         FROM goods AS g WHERE g.name LIKE '%菓子%'
> (#     UNION SELECT g.key, g.key_p, g.name
> (#         FROM goods AS g, t WHERE g.key_p = t.key
> (# ) SELECT t.key, t.key_p, t.name FROM t;
>  key  | key_p |    name    
> ------+-------+------------
>  1500 | 1000  | お菓子
>  1510 | 1500  | 和菓子
>  1520 | 1500  | 洋菓子
>  1511 | 1510  | 生和菓子
>  1512 | 1510  | まんじゅう
>  1513 | 1510  | ようかん
>  1514 | 1510  | せんべい
>  1515 | 1510  | 最中
>  1521 | 1520  | プリン
>  1522 | 1520  | ゼリー
>  1523 | 1520  | ケーキ
>  1524 | 1520  | パイ
>  1525 | 1520  | カステラ
> (13 rows)

以上、よろしくお願いします。


pgsql-jp メーリングリストの案内