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

sql fiddle demo

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;
Другие вопросы по тегам