簡體   English   中英

語法: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;

加入過程是否有首選語法?

過程根本不能嵌套在外部查詢

但是我在這里看到一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM