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

Tại sao tôi không thể loại trừ các cột phụ thuộc khỏi `GROUP BY` khi tôi tổng hợp theo một khóa?

Bởi vì chỉ PK bao gồm tất cả các cột của bảng cơ bản trong GROUP BY mệnh đề. Do đó truy vấn đầu tiên của bạn hoạt động. Một UNIQUE không ràng buộc.

Sự kết hợp của UNIQUE không thể hoãn lại và NOT NULL ràng buộc cũng sẽ đủ điều kiện. Nhưng điều đó không được triển khai - cũng như một số phụ thuộc chức năng khác được biết đến với tiêu chuẩn SQL. Peter Eisentraut, tác giả chính của tính năng này, đã nghĩ nhiều hơn, nhưng vào thời điểm đó người ta xác định rằng nhu cầu thấp và chi phí liên quan có thể cao. Xem thảo luận về tính năng trên pgsql-hacker.

Hướng dẫn sử dụng:

Khi GROUP BY hiện tại hoặc bất kỳ hàm tổng hợp nào hiện có, không hợp lệ cho SELECT liệt kê các biểu thức để tham chiếu đến các cột không được nhóm ngoại trừ trong các hàm tổng hợp hoặc khi các cột không được nhóm phụ thuộc về mặt chức năng vào các cột được nhóm, vì nếu không sẽ có nhiều hơn một giá trị có thể trả về cho một cột không được nhóm. Tồn tại phụ thuộc chức năng nếu các cột được nhóm (hoặc asubset của chúng) là khóa chính của bảng chứa cột được nhóm chung.

Và rõ ràng hơn:

PostgreSQL nhận ra sự phụ thuộc chức năng (cho phép các cột được lấy từ GROUP BY ) chỉ khi khóa chính của bảng được bao gồm trong GROUP BY danh sách. Tiêu chuẩn SQL chỉ định các điều kiện bổ sung cần được công nhận.

Kể từ khi c.vinUNIQUE NOT NULL , bạn có thể sửa truy vấn thứ hai của mình bằng cách sử dụng cột PK thay thế:

...
group by c.id;

Ngoài ra, trong khi tính toàn vẹn tham chiếu được thực thi và toàn bộ bảng được truy vấn, cả hai truy vấn đã cho có thể rẻ hơn đáng kể:tổng hợp các hàng trong appraisal trước đây sự tham gia. Điều này loại bỏ sự cần thiết phải GROUP BY trong SELECT bên ngoài tiên nghiệm. Như:

SELECT c.vin, c.color, c.brand
     , a.min_appraisal
     , a.max_appraisal
FROM   car c
LEFT   JOIN (
   SELECT car_vin
        , min(price) AS min_appraisal
        , max(price) AS max_appraisal
   FROM   appraisal
   GROUP  BY car_vin
   ) a ON a.car_vin = c.vin;

Xem:

  • Nhiều lệnh gọi array_agg () trong một truy vấn duy nhất

Có liên quan:

  • Câu lệnh SQL hoạt động trong MySQL không hoạt động trong Postgresql - Sum &group_by rails 3
  • PostgreSQL - Mệnh đề GROUP BY



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Barman 2.11:barman-cloud-restore và barman-cloud-wal-restore

  2. cột postgres X không tồn tại

  3. Sử dụng jsonb_set () để cập nhật giá trị mảng jsonb cụ thể

  4. Làm cách nào để lấy dữ liệu cục bộ vào cơ sở dữ liệu chỉ đọc bằng dplyr?

  5. tại sao PG ::UniqueViolation:LỖI:giá trị khóa trùng lặp vi phạm ràng buộc duy nhất?