Như Frank đã giải thích, PostgreSQL sẽ từ chối bất kỳ truy vấn nào không trả về tập hợp các hàng có thể tái tạo.
Giả sử bạn có một truy vấn như:
select a, b, agg(c)
from tbl
group by a
PostgreSQL sẽ từ chối nó vì b
được để không xác định trong nhóm group by
bản tường trình. Ngược lại, hãy chạy nó trong MySQL và nó sẽ được chấp nhận. Tuy nhiên, trong trường hợp thứ hai, hãy kích hoạt một vài lần chèn, cập nhật và xóa, và thứ tự của các hàng trên các trang đĩa sẽ khác nhau.
Nếu bộ nhớ phục vụ, chi tiết triển khai để MySQL thực sự sẽ sắp xếp theo a, b và trả về b đầu tiên trong tập hợp. Nhưng đối với tiêu chuẩn SQL có liên quan, hành vi là không xác định - và đủ chắc chắn, PostgreSQL không không luôn sắp xếp trước khi chạy các hàm tổng hợp.
Có thể, điều này có thể dẫn đến các giá trị khác nhau của b
trong kết quả đặt trong PostgreSQL. Và do đó, PostgreSQL gây ra lỗi trừ khi bạn cụ thể hơn:
select a, b, agg(c)
from tbl
group by a, b
Điều Frank nhấn mạnh là, trong PostgreSQL 9.1, nếu a
là khóa chính, bạn có thể để lại b
không xác định - người lập kế hoạch đã được dạy để bỏ qua nhóm tiếp theo của các trường khi các khóa chính có thể áp dụng ngụ ý một hàng duy nhất.
Đối với vấn đề của bạn cụ thể, bạn cần chỉ định nhóm của mình theo cách bạn hiện đang làm, cộng với mọi trường mà bạn dựa vào tổng hợp của mình, tức là "widgets"."id", "widgets"."user_id", [snip]
nhưng không phải là những thứ như sum(amount)
, là các lệnh gọi hàm tổng hợp.
Như một lưu ý ngoài chủ đề, tôi không chắc ORM / mô hình của bạn hoạt động như thế nào nhưng SQL mà nó tạo ra không tối ưu. Nhiều liên kết bên ngoài bên trái có vẻ như chúng phải là liên kết bên trong. Điều này sẽ dẫn đến việc cho phép người lập kế hoạch chọn một thứ tự tham gia thích hợp nếu có.