Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:将查询返回应用于函数_Sql_Postgresql_Common Table Expression - Fatal编程技术网

PostgreSQL:将查询返回应用于函数

PostgreSQL:将查询返回应用于函数,sql,postgresql,common-table-expression,Sql,Postgresql,Common Table Expression,我有一个递归方法定义如下: 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查询返回的每一行调用这个函数,该SQL

我有一个递归方法定义如下:

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查询返回的每一行调用这个函数,该SQL查询在递归查询中定义了一个列值,标记为


我真的不想通过python调用X查询,这会减慢速度,必须有一种方法在sql中实现。我试图用plpgsql编写一个函数,但我在定义返回类型setof TABLE和每次取它的并集时遇到问题。

我不确定我是否完全理解这个问题,您的问题是根据返回的值对多个初始值调用递归函数吗

在这种情况下,您是否可以使用所有必需的值立即创建初始表,然后在其中递归?大概是这样的:

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
)

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
;

但不一定要成为联接。可能是一个简单的例子,rel_to_id IN从某个_值中选择某个_id。谢谢你的回答,我尝试了这个方法,但是这个查询的结果是错误的,输出包含重复的列==>temp_视图有a、b、c列,而另一个_表有相同的列,但是输出是:a、b、c、a、b、c这里没有返回类型的表集。不是桌子就是一套。看见