2012-12-05 48 views
1

我想創建一個函數,它返回boss的上方有多少個級別(調用函數)。postgres SQL,函數

這裏是我想做到這一點,但我不太知道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 

會很好,如果有人可以擺脫一些光線,

謝謝!

回答

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 
+0

謝謝,多少不勝感激! – Susan

+0

@蘇珊 - 不客氣! –

+0

這是對舊版本的解決方法,截至8.4(2009年發佈),PostgreSQL具有遞歸查詢。更容易和更快。 –

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;