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)
マニュアルには明確な言及があります。
クレイグの関連する回答(ダニエルが参照)はそれに応じて更新されます:
- SQLクエリで(func())。*構文を使用して複数の関数の評価を回避するにはどうすればよいですか?