GROUP BY A.*
không được phép trong SQL.
Bạn có thể bỏ qua điều này bằng cách sử dụng truy vấn con nơi bạn nhóm theo và sau đó tham gia:
SELECT A.*, COALESCE(B.cnt, 0) AS Count_B_Foo
FROM TABLE1 AS A
LEFT JOIN
( SELECT FKey, COUNT(foo) AS cnt
FROM TABLE2
GROUP BY FKey
) AS B
ON A.PKey = B.FKey ;
Có một tính năng trong tiêu chuẩn SQL-2003 để cho phép trong SELECT
danh sách, các cột không có trong GROUP BY
danh sách, miễn là chúng phụ thuộc chức năng vào chúng. Nếu tính năng đó đã được triển khai trong SQL-Server, truy vấn của bạn có thể đã được viết là:
SELECT A.*, COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.pk --- the Primary Key of table A
Thật không may, tính năng này chưa được triển khai, ngay cả trong phiên bản SQL-Server 2012 - và không có trong bất kỳ DBMS nào khác như tôi biết. Ngoại trừ MySQL có nó nhưng không đầy đủ (không đầy đủ như: truy vấn trên sẽ hoạt động nhưng công cụ sẽ không kiểm tra sự phụ thuộc chức năng và các truy vấn không bằng văn bản khác sẽ hiển thị kết quả bán ngẫu nhiên sai).
Như @Mark Byers đã thông báo cho chúng tôi trong một bình luận, PostgreSQL 9.1 đã thêm một tính năng mới được thiết kế cho mục đích này. Nó hạn chế hơn so với triển khai của MySQL.
GROUP BY
mệnh đề trongSELECT
danh sách, nhưng nó không được xác định là hàng đó sẽ xuất phát từ đâu (vì vậy nếu cột hoặc biểu thức không xuất hiện 't chức năng phụ thuộc vào biểu thức nhóm, sau đó nó có thể đến từ bất kỳ hàng trong nhóm).