W Postgresie 9.3 lub nowszym zazwyczaj najlepiej jest użyć 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;
Jeśli funkcja foo()
może zwrócić brak wierszy , jest to bezpieczna forma, ponieważ zachowuje wszystkie wiersze na lewo od złączenia, nawet jeśli żaden wiersz nie jest zwracany po prawej stronie.
Inaczej lub jeśli chcesz aby wykluczyć wiersze bez wyniku z łączenia bocznego, użyj:
CROSS JOIN LATERAL foo(sub.arr)
lub skrót:
, foo(sub.arr)
W instrukcji znajduje się wyraźna wzmianka.
Powiązana odpowiedź Craiga (do której odwołuje się Daniel) została odpowiednio zaktualizowana:
- Jak uniknąć wielu ewaluacji funkcji za pomocą składni (func()).* w zapytaniu SQL?