【问题标题】:Syntax: PostgreSQL with lateral join to stored procedure语法:PostgreSQL 与存储过程的横向连接
【发布时间】:2020-08-09 14:10:24
【问题描述】:

PostgreSQL 11.1

我有一个程序定义为:

FUNCTION Copy_Name( to_keep_id integer, to_delete_id integer, parent_table text) RETURNS VOID

我可以将它与 cte 一起使用吗:

WITH _in (to_keep_name, to_del_name) AS (
    VALUES ('tom', 'bob')
),
_to (keep_name_id, del_name_id)  AS (
    SELECT keep_name.id, del_name.id
    FROM _in
    JOIN tempA keep_name ON (keep_name.name = _in.to_keep_name)
    JOIN tempA del_name ON  (del_name.name = _in.to_del_name)
)
SELECT * 
FROM _to
JOIN LATERAL Copy_Name(_to.keep_name_id, _to.del_name_id, 'tempA') ON true;

是否有用于连接过程的首选语法?

【问题讨论】:

  • 你的函数返回VOID。为什么要在查询中使用它?这似乎没什么用。
  • @GordonLinoff 只是试图在 cte 旁边运行存储过程。 (顺便说一句,它确实有效)。注意:存储过程对相关文件进行操作。我不需要任何输出。
  • @GordonLinoff:在查询中使用这样的函数是有意义的,用查询产生的值调用它 N 次。这有点滥用 SQL 的副作用,但它确实有效。问题中的其他几件事没有意义。

标签: sql postgresql function join lateral-join


【解决方案1】:

我更愿意将其设为 CROSS JOIN,然后删除 ON true。或者只使用逗号连接。

在这种情况下,LATERAL 是一个干扰词,因为函数调用是隐式横向的。我可能也会放弃它,除非我认为将来我(或正在阅读代码的任何人)现在不会关注此功能。如果我是写给编码爱好者阅读的,我可能会保留它。

【讨论】:

    【解决方案2】:

    Procedures 根本不能嵌套在外部查询中

    但我在这里看到一个 function,而且没有任何程序。由于它返回 void,您可以将其放在 SELECT 列表中,删除 CTE,因为您“不需要任何输出”,您的查询会被烧毁为: p>

    SELECT copy_name(keep_name.id, del_name.id, 'tempA')
    FROM   tempA keep_name
    JOIN   tempA del_name ON keep_name.name = 'tom'
                         AND del_name.name = 'bob';
    

    为每个函数调用返回一个 NULL 值。 (不过,有效的交叉自连接似乎很奇怪。)

    否则你需要一个 LEFT JOIN 才有意义:

    SELECT * 
    FROM _to
    LEFT JOIN LATERAL copy_name(_to.keep_name_id, _to.del_name_id, 'tempA') ON true;
    

    见:

    旁白:Postgres 11.1?见https://www.postgresql.org/support/versioning/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-30
      • 2021-02-21
      • 2020-05-16
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多