In Postgres 9.3 of hoger is het meestal het beste om LEFT JOIN LATERAL ... ON true
te gebruiken :
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;
Als de functie foo()
kan geen rijen retourneren , dat is de veilige vorm omdat het alle rijen links van de join behoudt, zelfs als er geen rij naar rechts wordt teruggestuurd.
Anders, of als je wilt om rijen zonder resultaat uit te sluiten van de laterale verbinding, gebruik:
CROSS JOIN LATERAL foo(sub.arr)
of de steno:
, foo(sub.arr)
Er staat een expliciete vermelding in de handleiding.
Craig's gerelateerde antwoord (verwezen door Daniel) is dienovereenkomstig bijgewerkt:
- Hoe vermijd je het evalueren van meerdere functies met de (func()).* syntaxis in een SQL-query?