2012-12-05 11 views
1

Я хочу создать функцию, которая возвращает количество уровней босса над человеком (вызов функции).postgres SQL, function

Вот как я хотел бы это сделать, но я не знаю, как синтаксис 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;