V Postgresu 9.3 nebo novějším je obvykle nejlepší použít 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;
Pokud je funkce foo()
může vrátit žádné řádky , jedná se o bezpečný formulář, protože zachovává všechny řádky nalevo od spojení, i když není vrácen žádný řádek vpravo.
Jinak, nebo chcete-li chcete pro vyloučení řádků bez výsledku z bočního spojení použijte:
CROSS JOIN LATERAL foo(sub.arr)
nebo zkratka:
, foo(sub.arr)
V manuálu je výslovná zmínka.
Související Craigova odpověď (odkazovaná Danielem) je odpovídajícím způsobem aktualizována:
- Jak se vyhnout vícenásobným hodnotám funkcí pomocí syntaxe (func()).* v dotazu SQL?