使用另一个查询的输出动态执行查询

时间:2014-03-14 15:56:32

标签: sql postgresql dynamic plpgsql lateral

我有一个名为generate_table的函数,它接受2个输入参数(rundate::datebranch::varchar

现在我正在尝试使用PLPGSQL处理第二个函数,它将获得所有分支的列表以及每个分支的最新日期,并将其作为参数传递给generate_table函数。

我的查询是:

select max(rundate) as rundate, branch
from t_index_of_imported_files
group by branch

结果如下:

rundate;branch 
2014-03-13;branch1
2014-03-12;branch2
2014-03-10;branch3
2014-03-13;branch4

我需要的是该函数运行类似这样的

select generate_table('2014-03-13';'branch1');
select generate_table('2014-03-12';'branch2');
select generate_table('2014-03-10';'branch3');
select generate_table('2014-03-13';'branch4');

我一直在阅读很多关于PLPGSQL的内容,但到目前为止,我只能说我几乎不了解基础知识。

我读到可以使用连接来获取所有值,然后在函数中使用EXECUTE,但我无法使其正常工作。

有关如何执行此操作的任何建议?

3 个答案:

答案 0 :(得分:2)

您可以使用Postgres 9.3 +中的新LATERAL JOIN进行简单的SELECT查询来执行此操作

SELECT *
FROM  (
   SELECT max(rundate) AS rundate, branch
   FROM   t_index_of_imported_files
   GROUP  BY branch
   ) t
 , generate_table(t.rundate, t.branch) g;  -- LATERAL is implicit here

Per documentation:

  

LATERAL也可以在函数调用FROM项之前,但在此处   case是一个干扰词,因为函数表达式可以参考   在任何情况下都是早期的FROM项。

通过在SELECT列表中扩展set-returns函数的行,旧版本可以实现相同的功能,但LATERAL的新语法更清晰。无论如何,对于Postgres 9.2或更早版本:

SELECT generate_table(max(rundate), branch)
FROM   t_index_of_imported_files
GROUP  BY branch;

答案 1 :(得分:0)

select generate_table(max(rundate) as rundate, branch)
from t_index_of_imported_files
group by branch

答案 2 :(得分:0)

无需做任何太花哨的事。

SELECT generate_table(rundate,branch) FROM (
    SELECT max(rundate) AS rundate, branch
    FROM t_index_of_imported_files
    GROUP BY branch) x;