В Postgres 9.3 или по-нова версия обикновено е най-добре да използвате LEFT JOIN LATERAL ... ON true
:
SELECT sub.dataid, f.*
FROM (
SELECT dataid, array_agg(data) AS arr
FROM dataset
WHERE dataid = something
GROUP BY 1
) sub
LEFT JOIN LATERAL foo(sub.arr) f ON true;
Ако функцията foo()
може да върне няма редове , това е безопасната форма, тъй като запазва всички редове отляво на съединението, дори когато нито един ред не е върнат вдясно.
Иначе или ако искате за да изключите редове без резултат от страничното свързване, използвайте:
CROSS JOIN LATERAL foo(sub.arr)
или стенография:
, foo(sub.arr)
Има изрично споменаване в ръководството.
Свързаният отговор на Крейг (посочен от Даниел) се актуализира съответно:
- Как да избегнем множество функции eval със синтаксиса (func()).* в SQL заявка?