Повторное использование жестко заданного значения в нескольких вызовах функций в запросе PostgreSQL.

У меня есть несколько функций в PostgreSQL 9.0, которые возвращают результаты таблицы. Идея заключается в том, чтобы вернуть данные в том виде, в каком они были в определенное время, например.

CREATE FUNCTION person_asof(effective_time timestamp with time zone)
RETURNS SETOF person
...

CREATE FUNCTION pgroup_asof(effective_time timestamp with time zone)
RETURNS SETOF pgroup
...

Я могу запрашивать их почти так же, как если бы они были таблицами, с объединениями и всем остальным:

SELECT *
FROM pgroup_asof('2011-01-01') g
JOIN person_asof('2011-01-01') p
ON g.id = p.group_id

Это прекрасно работает, но есть ли какой-нибудь трюк, который я могу использовать, чтобы указать эффективное время только один раз?

Я пытался сделать что-то вроде этого:

SELECT *
FROM (SELECT '2010-04-12'::timestamp ts) effective,
pgroup_asof(effective.ts) g
JOIN person_asof(effective.ts) p
ON g.id = p.group_id

... но это не удается с ОШИБКОЙ: функциональное выражение в FROM не может ссылаться на другие отношения того же уровня запроса, и помещение основного запроса в подзапрос также не помогает.


person EMP    schedule 14.07.2011    source источник
comment
Вы можете подготовить оператор, используя один параметр $1 (отметка времени с часовым поясом). Я не вижу другого решения этой проблемы.   -  person Grzegorz Szpetkowski    schedule 14.07.2011


Ответы (1)


Это то, что я хотел сделать и в прошлом, но пока не похоже, что это возможно, но может быть надежда на горизонте.

person Gavin    schedule 14.07.2011
comment
+1 Интересно читать, спасибо. Похоже, что LATERAL не попал в 9.1 — возможно, в 9.2? Моя проблема, однако, не обязательно требует LATERAL, потому что я хочу повторно использовать только константу, а не строку, возвращенную из запроса. - person EMP; 14.07.2011