GROUP BY A.*
nie jest dozwolone w SQL.
Możesz to obejść, używając podzapytania, w którym grupujesz, a następnie dołączasz:
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 ;
W standardzie SQL-2003 istnieje funkcja pozwalająca na SELECT
liście kolumny, których nie ma na GROUP BY
liście, o ile są od nich funkcjonalnie zależne. Jeśli ta funkcja została zaimplementowana w SQL-Server, twoje zapytanie mogłoby zostać zapisane jako:
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
Niestety, ta funkcja nie została jeszcze zaimplementowana, nawet w wersji SQL-Server 2012 - i o ile wiem, nie w żadnym innym DBMS. Z wyjątkiem MySQL, który ma go, ale nieodpowiednio (nieodpowiednio, ponieważ powyższe zapytanie będzie działać, ale silnik nie sprawdzi zależności funkcjonalnej, a inne źle napisane zapytania pokażą nieprawidłowe, pół losowe wyniki).
Jak @Mark Byers poinformował nas w komentarzu, PostgreSQL 9.1 dodał nową funkcję zaprojektowaną do tego celu. Jest bardziej restrykcyjny niż implementacja MySQL.
GROUP BY
klauzuli naSELECT
liście, ale nie określa , z którego wiersza będzie pochodzić ta wartość (więc jeśli kolumna lub wyrażenie nie jest nie jest funkcjonalnie zależny od wyrażenia grupującego, wówczas może pochodzić z dowolnego wiersza w grupie).