PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Rails mở rộng các lĩnh vực với phạm vi, PG không thích nó

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ó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TẠO NGÔN NGỮ plpython3u - PostgreSQL 9.6

  2. Câu lệnh BREAK trong PL / pgSQL

  3. tại sao postgres đưa ra lỗi cập nhật hàng đồng thời khi tôi đang khóa toàn bộ bảng một cách rõ ràng

  4. Thêm đối tượng Postgres vào Template1

  5. Cập nhật Postgres với một liên kết bên trong trên 2 bảng?