0

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;

加入过程是否有首选语法?

4

2 回答 2

2

过程根本不能嵌套在外部查询

但是我在这里看到了一个函数,没有程序。因为它返回void,你可以把它放在SELECT列表中,删除 CTE,因为你“不需要任何输出”,你的查询会被烧毁为:

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/

于 2020-04-26T14:13:58.527 回答
1

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

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

于 2020-04-26T13:49:26.517 回答