Ответ 1
Я думаю, что это невозможно сделать в текущей версии PostgreSQL (9.2). В 9.3 было бы LATERAL join, которое делает именно то, что вы хотите.
Вы можете, однако, apply
возвращать набор простых значений:
select id, func(id) as f from tbl1
У меня есть табличная функция PL/pgsql, которая принимает как 1 вход целое число, ID. Возвращаемая таблица имеет фиксированные столбцы (скажем, 5), но различное количество строк.
Существует большая таблица этих уникальных идентификаторов. Я хотел бы применить эту функцию к каждому ID и UNION ALL.
В режиме онлайн я продолжаю рассматривать CROSS APPLY как решение, но, похоже, оно не доступно в PostgreSQL. Как я могу выполнить эту операцию?
Одним из тривиальных решений является переписать табличную функцию с дополнительным внешним циклом. Но есть ли способ сделать это непосредственно в SQL?
Я думаю, что это невозможно сделать в текущей версии PostgreSQL (9.2). В 9.3 было бы LATERAL join, которое делает именно то, что вы хотите.
Вы можете, однако, apply
возвращать набор простых значений:
select id, func(id) as f from tbl1
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;