PostgreSQL函数从嵌套查询返回结果集

时间:2015-01-30 14:34:57

标签: sql postgresql stored-procedures plpgsql

我必须编写一个PL / pgSQL存储过程,它有两个输入 第一个输入应该进入一个返回一组时间戳的选择。

使用这些返回的时间戳,我打算循环第二个选择,它接受函数的第二个输入并返回我必须在循环的迭代中收集的单个行。然后我组装第二个选择的输出并将其作为结果集返回。

FUNCTION (Input A B)
SELECT FROM T1 WHERE X = A INTO RS1.
LOOP VAL OVER RS1
   Select FROM T2 WHERE Y = B AND Z = VAL INTO RS2
END LOOP
RETURN ASSEMBLED RS2

有人可以指出我可以继续工作的工作骨架,顺便说一下。我需要从文档中获得哪些相关部分?我想我需要:

  • RETURNS TABLE () AS声明结果集

  • CURSOR使用第一个查询的结果循环第二个查询

2 个答案:

答案 0 :(得分:0)

尝试使用Common Table Expressions而不是尝试使用pgpsql代码在行上显式迭代:

with T1_vals as (
  select val from T1 where X = A
), T2_vals as (
  select T2.val from T2, T1_vals where T2.Z = T1_vals.val and T2.Y = B
) select val from T2_vals;

作为一般规则:当您想要明确地对值进行迭代时要小心,因为SQL通常提供了性能更好的简化解决方案。

答案 1 :(得分:0)

您不需要游标,嵌套函数调用或循环 您也不需要CTE

使用JOIN的基本查询:

SELECT t2.*
FROM   t1
JOIN   t2 ON t2.z = t1.val 
WHERE  t1.x = _input_a
AND    t2.y = _input_b;

基于集合的解决方案通常优于SQL中的过程方法。循环是最好的解决方案。