GROUP BY A.*
не допускается в SQL.
Вы можете обойти это, используя подзапрос, по которому вы группируете, а затем присоединитесь:
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 ;
В стандарте SQL-2003 есть функция, позволяющая включать в SELECT
список столбцы, которых нет в GROUP BY
списке, если они функционально зависят от них. Если бы эта функция была реализована в SQL-сервере, ваш запрос мог бы быть написан так:
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
К сожалению, эта функция еще не реализована, даже в версии SQL-Server 2012 - и, насколько я знаю, ни в какой другой СУБД. За исключением MySQL, который имеет его, но неадекватно (неадекватно: вышеуказанный запрос будет работать, но механизм не будет проверять функциональную зависимость, а другие плохо написанные запросы будут показывать неправильные, полуслучайные результаты).
Как сообщил нам @Mark Byers в комментарии, PostgreSQL 9.1 добавил новую функцию, предназначенную для этой цели. Это более ограничительно, чем реализация MySQL.
GROUP BY
предложение вSELECT
списке, но он не определяет , из какой строки будет получено это значение (поэтому, если столбец или выражение не не зависит от выражения группировки, то оно может быть из любой строки в группе).