Синтаксис: PostgreSQL с боковым присоединением к хранимой процедуре - PullRequest
0 голосов
/ 26 апреля 2020

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;

Есть ли предпочтительный синтаксис для присоединения к процедуре?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2020

Процедуры не могут быть вложены во внешние запросы вообще .

Но я вижу функция здесь и без процедуры. Так как он возвращает 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/

1 голос
/ 26 апреля 2020

Я бы предпочел сделать это CROSS JOIN, а затем сбросить ON true. Или просто используйте соединение через запятую.

В этом случае LATERAL является шумовым словом, поскольку вызовы функций неявно латеральны. Я бы, вероятно, также отбросил бы это, если бы я не думал, что в будущем я (или тот, кто читает код) не будет сейчас об этой функции. Если бы я писал для любителей кодирования, я мог бы сохранить это.

...