PostgreSQL: применить возврат запроса к функции - PullRequest
1 голос
/ 20 сентября 2011

У меня есть рекурсивный метод, определенный ниже:

with recursive temp(id, s, r, e) as (
    select *
    from rel
    where rel_to_id = <parameter from sql query>

    union all

    select *
    from temp P
    inner join relationship C on P.r = C.s
)

и мне нужно вызывать это для каждой строки, возвращаемой из запроса SQL со значением столбца, определенным в рекурсивном запросе (помеченном как)

Я действительно не хочу вызывать X-запросы через python, что замедляет работу, должен быть способ сделать это в sql. Я пытался написать функцию в plpgsql, но у меня возникли проблемы с определением типа возвращаемого значения set из TABLE и принятием его объединения каждый раз.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2011

ИМХО вызов рекурсивного запроса несколько раз, один раз для каждого параметра - самое худшее, что вы можете сделать. Вместо этого вы должны объединить рекурсивный запрос с тем, который предоставляет значения параметров, и перебрать их «продукт». Часто удобно временно упаковать рекурсивный запрос в представление и объединить его с другим участком запроса. Оптимизатор позаботится.

CREATE VIEW temp_view AS (
    with recursive temp(id, s, r, e) as (
    SELECT *
    from rel
    WHERE {recursive_condition}
    -- Omit the restriction
    -- AND rel_to_id = <parameter from sql query>
    union /* all? */
    select *
    from temp P
    inner join relationship C on P.r = C.s
    WHERE {recursion_stopper}
    ) SELECT * FROM temp_view
);

-- Now join the recursive part
-- with the one that supplies the restrictions
SELECT ...
FROM temp_view tv
    , other_table ot
WHERE tv.parameter = ot.parameter
AND ... -- more stuff
;
0 голосов
/ 20 сентября 2011

Я не уверен, что полностью понимаю проблему, является ли ваша проблема вызывать вашу рекурсивную функцию для более чем 1 начального значения в соответствии со значениями, возвращаемыми вашим?

В таком случае, не могли бы вы простосоздать исходную таблицу сразу со всеми необходимыми значениями, а затем обработать ее?Как то так:

with recursive temp(id, s, r, e) as (
    select *
    from rel r
    join <sql query> q on r.rel_to_id = q.id

    union all

    select *
    from temp P
    inner join relationship C on P.r = C.s
)
...