Trong Postgres 9.3 trở lên, thường tốt nhất là sử dụng 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;
Nếu hàm foo()
có thể trả về không có hàng nào , đó là biểu mẫu an toàn vì nó bảo toàn tất cả các hàng ở bên trái của phép nối, ngay cả khi không có hàng nào được trả về bên phải.
Khác, hoặc nếu bạn muốn để loại trừ các hàng không có kết quả từ phép nối bên, hãy sử dụng:
CROSS JOIN LATERAL foo(sub.arr)
hoặc viết tắt:
, foo(sub.arr)
Có một đề cập rõ ràng trong sách hướng dẫn.
Câu trả lời liên quan của Craig (do Daniel tham khảo) được cập nhật tương ứng:
- Làm cách nào để tránh nhiều lần trốn tránh hàm với cú pháp (func ()). * trong truy vấn SQL?