2012-12-05 50 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;