[英]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;
加入過程是否有首選語法?
過程根本不能嵌套在外部查詢中。
但是我在這里看到一個function ,沒有程序。 由於它返回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';
為每個 function 調用返回一個 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/
我寧願將其設為 CROSS JOIN ,然后刪除ON true
。 或者只是使用逗號連接。
在這種情況下,LATERAL 是一個干擾詞,因為 function 調用是隱式橫向的。 我可能也會放棄它,除非我認為將來我(或正在閱讀代碼的任何人)現在不會關注此功能。 如果我是寫給編碼愛好者閱讀的,我可能會保留它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.