Truy vấn đơn giản
Điều này có thể đơn giản hơn nhiều với PostgreSQL 9.1 trở lên . Như đã giải thích trong câu trả lời có liên quan chặt chẽ này:
- PGError:ERROR:không được phép tổng hợp trong mệnh đề WHERE trên truy vấn AR của một đối tượng và has_many đối tượng của nó
Nó là đủ để GROUP BY
khóa chính của một bảng. Kể từ:
foo1 là một khóa chính
.. bạn có thể đơn giản hóa ví dụ của mình thành:
SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ')
FROM tbl1
GROUP BY 1
ORDER BY foo7, foo8; -- have to be spelled out, since not in select list!
Truy vấn với nhiều bảng
Tuy nhiên, vì bạn có:
nhiều trường khác và THAM GIA TRÁI, phần quan trọng là tất cả các trường này có mối quan hệ từ 1 đến 1 hoặc 1 đến 0 ngoại trừ một trường từ 1 đến n mà tôi muốn tổng hợp lại
.. sẽ nhanh hơn và đơn giản hơn nếu tổng hợp trước, tham gia sau :
SELECT t1.foo1, t1.foo2, ...
, t2.bar1, t2.bar2, ...
, a.aggregated_col
FROM tbl1 t1
LEFT JOIN tbl2 t2 ON ...
...
LEFT JOIN (
SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col
FROM agg_tbl a ON ...
GROUP BY some_id
) a ON a.some_id = ?.some_id
ORDER BY ...
Bằng cách này, phần lớn truy vấn của bạn không cần tổng hợp.
Gần đây tôi đã cung cấp một trường hợp thử nghiệm trong SQL Fiddle để chứng minh quan điểm trong câu trả lời có liên quan này:
- PostgreSQL - sắp xếp theo một mảng
Vì bạn đang đề cập đến câu trả lời có liên quan này:Không, DISTINCT
sẽ không giúp ích được gì trong trường hợp này.