1

上司が人の上にあるレベルの数を返す関数を作成したい(関数を呼び出す)。

これが私がやりたい方法ですが、SQL構文がどのように機能するかよくわかりません http://pastebin.com/dyDaGwf9

テーブルは次のようになります。

workerid    name    chefid
1           Bob     
2           Alice   1
3           Joe     1
4           John    2
5           Dirk    4
6           Ralf    2
7           Lisa    1
8           Lyn     3

関数を呼び出したときの最終結果は次のようになります

関数呼び出し:

Select workerid, name, rankFunction(workerid) from workers;

workerid    name    rank
1           Bob     0
2           Alice   1
3           Joe     1
4           John    2
5           Dirk    3
6           Ralf    2
7           Lisa    1
8           Lyn     2

誰かが光を当てることができれば素晴らしいだろう、

ありがとう!

4

2 に答える 2

3

このための関数は必要ありません。再帰クエリ(バージョン8.4以降で使用可能)だけです。

WITH RECURSIVE chef as (
    SELECT workerid, name, chefid, 0 AS rank FROM workers WHERE chefid is null
    UNION ALL
    SELECT workers.workerid, workers.name, workers.chefid, rank + 1 
    FROM workers JOIN chef ON workers .chefid = chef.workerid 
)
SELECT workerid, name, rank FROM chef ORDER BY workerid;
于 2012-12-05T08:17:16.910 に答える
1

これが単純な再帰です。

CREATE OR REPLACE FUNCTION rankFunction(worker_id int)
  RETURNS int AS
$BODY$
DECLARE
    temp_chefid int;
BEGIN
    temp_chefid := (SELECT chefid from workers where workerid = worker_id);
    IF(temp_chefid IS NULL) THEN
         RETURN 0;
    ELSE RETURN 1 + rankFunction(temp_chefid);
    END IF;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
于 2012-12-05T07:41:09.527 に答える