У меня есть несколько функций в 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 не может ссылаться на другие отношения того же уровня запроса, и помещение основного запроса в подзапрос также не помогает.