In Postgres 9.3 oder höher ist es normalerweise am besten, LEFT JOIN LATERAL ... ON true
zu verwenden :
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;
Wenn die Funktion foo()
kann keine Zeilen zurückgeben , das ist die sichere Form, da sie alle Zeilen links vom Join beibehält, selbst wenn rechts keine Zeile zurückgegeben wird.
Sonst, oder wenn Sie wollen Um Zeilen ohne Ergebnis vom lateralen Join auszuschließen, verwenden Sie:
CROSS JOIN LATERAL foo(sub.arr)
oder die Abkürzung:
, foo(sub.arr)
Es gibt eine ausdrückliche Erwähnung im Handbuch.
Craigs verwandte Antwort (auf die von Daniel verwiesen wird) wird entsprechend aktualisiert:
- Wie kann man mehrere Funktionsauswertungen mit der (func()).*-Syntax in einer SQL-Abfrage vermeiden?