PostgreSQL: последовательно применять табличную функцию к набору значений и объединять ВСЕ результаты
У меня есть табличная функция PL/pgsql, которая принимает в качестве 1 ввода целое число, идентификатор. Возвращаемая таблица имеет фиксированные столбцы (скажем, 5), но различное количество строк.
Существует большая таблица этих уникальных идентификаторов. Я хотел бы применить эту функцию к каждому идентификатору и объединить все результаты.
В Интернете я продолжаю видеть CROSS APPLY в качестве решения, но в PostgreSQL его нет. Как я могу сделать эту операцию "применить"?
Одно из тривиальных решений - переписать табличную функцию с дополнительным внешним циклом. Но есть ли способ сделать это непосредственно в SQL?
2 ответа
Я думаю, что это невозможно сделать в текущей версии 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;