语法:带有横向连接到存储过程的 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/
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/