[pgsql-jp: 29805] Re: 再起的にデータ数をカウントするには

SAKANAKA Tatsumi sakanaka @ tokyo-gas.co.jp
2003年 5月 8日 (木) 12:26:11 JST


ツリーになってるんですよね?

ぼくは SQL だけで書くのはできなくてあきらめました。

結局、PL/pgSQL で、ある部署が、ある部署の先祖かどうかを判定する
関数 is_ancestor(部署, 先祖部署) とか? を書いて

SELECT count(社員.氏名) FROM 社員
  JOIN 部署 ON 社員.所属部署_cd =  部署.部署_cd
  WHERE is_ancestor(部署.部署_cd, '先祖') = true;

なんてことをしたような記憶があります(と思ってソースを探したら、
微妙に違うものをツリーのループ検出用トリガに使ってました)。

is_ancestor は部署.部署_cd から、「上の方」に(再帰呼び出しで
はなく、単純に LOOP で)手繰っていって、どこかで部署.部署_cd
が "hoge" にマッチすれば「先祖」ですから、true を返します。

最上位部署の "親部署_cd" が NULL でもいいなら、「上の方」に手繰っ
ていくとき、毎回 IF "親部署_cd" IS NULL してみて、NULL なら false
を返すようにすればよいと思います。

# SELECT INTO で、テーブル決めうちになるので、汎用性はまるであり
# ませんし、部署の数が多くなってくると実用に耐えるかどうか。また、
# SET を返す関数を作って、再帰呼び出しで全子孫を返すようにもでき
# ますね(これだと IN SELECT が使える)。

--さかなか@関数 index とか使えるのだろうか? 勉強不足。



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