GROUP BY A.*
tidak diizinkan dalam SQL.
Anda bisa melewati ini dengan menggunakan subquery tempat Anda mengelompokkannya, dan kemudian bergabung:
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 ;
Ada fitur dalam standar SQL-2003 untuk memungkinkan dalam SELECT
daftar, kolom yang tidak ada dalam GROUP BY
daftar, selama mereka secara fungsional bergantung padanya. Jika fitur itu telah diimplementasikan dalam SQL-Server, permintaan Anda bisa ditulis sebagai:
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
Sayangnya, fitur ini belum diimplementasikan, bahkan dalam versi SQL-Server 2012 - dan tidak dalam DBMS lain sejauh yang saya tahu. Kecuali untuk MySQL yang memilikinya tetapi tidak memadai (tidak memadai seperti: kueri di atas akan berfungsi tetapi mesin tidak akan melakukan pengecekan untuk dependensi fungsional dan kueri tertulis lainnya akan menunjukkan kesalahan, hasil semi-acak).
Ketika @Mark Byers memberi tahu kami dalam komentar, PostgreSQL 9.1 menambahkan fitur baru yang dirancang untuk tujuan ini. Ini lebih membatasi daripada implementasi MySQL.
GROUP BY
klausa dalamSELECT
daftar, tetapi membiarkannya tidak terdefinisi untuk baris mana nilai tersebut akan berasal (jadi jika kolom atau ekspresi tidak tidak secara fungsional bergantung pada ekspresi pengelompokan, maka itu bisa berasal dari baris apa pun dalam grup).