语法:带有横向连接到存储过程的 PostgreSQL

Syntax: PostgreSQL with lateral join to stored procedure

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;

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

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

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

Procedures 根本无法嵌套在外部查询中 .

可是我看到这里有个function,没有程序。由于它 returns void,您可以将其放在 SELECT 列表中,删除 CTE,因为您 "don't need any output" 您的查询烧成这样的东西:

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';

Returns 每个函数调用的 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/