PostgreSQL: последовательно применять табличную функцию к набору значений и результатам UNION ALL

У меня есть табличная функция PL/pgsql, которая принимает как 1 вход целое число, ID. Возвращаемая таблица имеет фиксированные столбцы (скажем, 5), но различное количество строк.

Существует большая таблица этих уникальных идентификаторов. Я хотел бы применить эту функцию к каждому ID и UNION ALL.

В режиме онлайн я продолжаю рассматривать CROSS APPLY как решение, но, похоже, оно не доступно в PostgreSQL. Как я могу выполнить эту операцию?

Одним из тривиальных решений является переписать табличную функцию с дополнительным внешним циклом. Но есть ли способ сделать это непосредственно в SQL?

Ответ 1

Я думаю, что это невозможно сделать в текущей версии PostgreSQL (9.2). В 9.3 было бы LATERAL join, которое делает именно то, что вы хотите.

Вы можете, однако, apply возвращать набор простых значений:

select id, func(id) as f from tbl1

sql fiddle demo

Ответ 2

SQL Fiddle

create table t (id int);
insert into t (id) select generate_series(1, 10);

create or replace function f (i integer)
returns table(id_2 integer, id_3 integer) as $$
    select id * 2 as id_2, id * 3 as id_3
    from t
    where id between i - 1 and i + 1
$$ language sql;

select id, (f(id)).*
from t;