【问题标题】:Postgresql Procedure select into temp tablePostgresql 过程选择进入临时表
【发布时间】:2020-08-01 23:06:58
【问题描述】:

作为最近从 SQL Server 转换过来的人,我对 Postgresql 有了一些了解。

我真的很讨厌在 SQL 中编写嵌套的 selevt 语句,因为我发现这样做会影响代码的可读性和可维护性。

通常我会在 SQL Server 中创建一个存储过程,我会在其中选择一些东西到一个临时表中,然后我可以在另一个 select 语句中使用它。

CREATE OR ALTER PROCEDURE Procname
AS

BEGIN

SELECT
    Somewhere.Col_1,
    Somewhere.Col_2

INTO
    #Temptable

FROM
    Somewhere Somewhere

SELECT
    Temptable.Col_1,
    Somewhere_Else.Col3

FROM
    #Temptable Temptable

INNER JOIN
    Somewhere_Else.Col_2 = Temptable.Col_2

END

当我执行这个过程时,我会得到最终的选择查询

如何在 Postgresql 中复制这个过程?

我知道您可以选择一个临时表,但我似乎无法弄清楚如何在同一过程中的下一个选择语句中使用该表

【问题讨论】:

  • (1) 我迷路了,您甚至没有在存储过程中使用临时表。 (2) 不应使用存储过程返回表;使用视图或表值函数。 (3) 两个数据库都支持您正在寻找的 CTE。
  • 对不起,我写的示例代码有点快。通常,我正在研究一个项目,在该项目中我必须在新的计算列等中使用计算列。使用嵌套的选择语句会很快变旧,这就是为什么我喜欢使用过程并选择可以加入的临时表的原因随时需要
  • 以这种方式使用临时表是一种在 SQL Server 用户中很常见的反模式。不要将其应用于其他 DBMS。
  • 那么避免嵌套选择语句的好方法是什么(我想尽可能使用连接而不是嵌套语句)
  • 啊,我看到了一个利用 CTE 的解决方案。目前看来符合要求

标签: sql postgresql nested


【解决方案1】:

创建一个集合返回函数,根本不需要临时表。

CREATE function Procname()
  returns table(col_1 ???, col2 ???) --<< change data types here
AS
$$
  SELECT
      Temptable.Col_1,
      Somewhere_Else.Col3
  FROM Somewhere Temptable
    INNER JOIN Somewhere_Else ON Somewhere_Else.Col_2 = Temptable.Col_2;
$$
language sql
stable;

但是对于这么简单的陈述,我宁愿创建一个视图。

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 2013-07-15
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2016-10-06
    相关资源
    最近更新 更多