【问题标题】:PostgreSQL function returning result set from nested queriesPostgreSQL 函数从嵌套查询返回结果集
【发布时间】:2015-01-30 14:34:57
【问题描述】:

我必须编写一个有两个输入的 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 使用第一个查询的结果循环第二个查询

【问题讨论】:

  • 当您可以使用 join 的简单查询轻松完成时,为什么还要在函数中执行此操作?
  • 好吧,问题是一个选择在 when 子句中使用了
  • JOININ 没有真正的关系——你可以阅读更多about the concept here

标签: sql postgresql stored-procedures plpgsql


【解决方案1】:

尝试使用 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 通常提供更简单的解决方案和更好的性能。

【讨论】:

    【解决方案2】:

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

    使用带有JOIN 的非常基本的查询:

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

    基于集合的解决方案通常优于 SQL 中的过程方法。循环是最佳解决方案的情况很少见。

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 2016-01-12
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      相关资源
      最近更新 更多