[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 メーリングリストの案内