GROUP BY A.*
no está permitido en SQL.
Puede omitir esto utilizando una subconsulta donde agrupe y luego se una:
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 ;
Hay una característica en el estándar SQL-2003 para permitir en la SELECT
lista, columnas que no están en la GROUP BY
lista, siempre que sean funcionalmente dependientes de ellas. Si esa característica se hubiera implementado en SQL-Server, su consulta podría haberse escrito como:
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
Desafortunadamente, esta característica aún no se ha implementado, ni siquiera en la versión SQL-Server 2012, y no en ningún otro DBMS, que yo sepa. Excepto para MySQL que lo tiene pero de manera inadecuada (de manera inadecuada como: la consulta anterior funcionará pero el motor no verificará la dependencia funcional y otras consultas mal escritas mostrarán resultados semialeatorios incorrectos).
Como @Mark Byers nos informó en un comentario, PostgreSQL 9.1 agregó una nueva característica diseñada para este propósito. Es más restrictivo que la implementación de MySQL.
GROUP BY
cláusula en laSELECT
lista, pero lo deja sin definir de qué fila vendrá ese valor (por lo tanto, si la columna o expresión no es 't funcionalmente dependiente de la expresión de agrupación, entonces podría venir de cualquier fila dentro del grupo).