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ệ choSELECT
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 trongGROUP 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.vin
là UNIQUE 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