Hàm tổng hợp chuẩn array_agg()
chỉ hoạt động với các loại cơ sở, không phải loại mảng làm đầu vào. (Nhưng Postgres 9.5+ có một biến thể mới của array_agg()
điều đó có thể!)
Bạn có thể sử dụng hàm tổng hợp tùy chỉnh array_agg_mult()
như được định nghĩa trong câu trả lời có liên quan này:
Chọn dữ liệu vào một mảng Postgres
Tạo nó một lần cho mỗi cơ sở dữ liệu. Sau đó, truy vấn của bạn có thể hoạt động như sau:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
FROM base.sched_entry se
LEFT JOIN base.user_sched_entry use USING (sched_entry_id)
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;
Có một lý do chi tiết trong câu trả lời được liên kết.
Mức độ phải phù hợp
Để trả lời nhận xét của bạn, hãy xem xét trích dẫn này từ sách hướng dẫn về các loại mảng:
Mảng nhiều chiều phải có các phạm vi phù hợp cho từng thứ nguyên. Sự không khớp sẽ gây ra lỗi.
Không có cách nào để giải quyết vấn đề đó, kiểu mảng không cho phép sự không khớp như vậy trong Postgres. Bạn có thể đệm các mảng của bạn bằng các giá trị NULL để tất cả các kích thước đều có phạm vi phù hợp.
Nhưng tôi muốn dịch các mảng thành danh sách được phân tách bằng dấu phẩy với array_to_string()
cho mục đích của truy vấn này và sử dụng string_agg()
để tổng hợp text
- tốt nhất là với một dải phân cách khác. Sử dụng một dòng mới trong ví dụ của tôi:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
FROM ...
Chuẩn hóa
Bạn có thể muốn xem xét việc chuẩn hóa giản đồ của mình để bắt đầu. Thông thường, bạn sẽ triển khai mối quan hệ n:m như vậy với một bảng riêng biệt như được nêu trong ví dụ này:
Làm thế nào để triển khai mối quan hệ nhiều-nhiều trong PostgreSQL?