我有一个下面定义的递归方法:
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查询返回的每一行上调用它,并在递归查询中定义一个列值(标记为)
我真的不想通过python调用X查询,这会减慢速度,必须有一种方法可以在sql中完成。我试着在plpgsql中编写一个函数,但是我无法定义返回类型setof TABLE并且每次都使用它的并集。
答案 0 :(得分:0)
我不确定我是否完全理解这个问题,根据您的返回值,您的问题是根据超过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
)
答案 1 :(得分:0)
IMHO多次调用递归查询,每个参数值一次是最糟糕的。相反,您应该将递归查询与提供参数值的查询相结合,并迭代其“产品”。通常,将递归查询临时打包到视图中并将其与查询的另一段连接起来是很方便的。优化者会照顾。
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
;