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
списку елементи, що не входять до цього пункту , але він не визначає, з якого рядка це значення буде надходити (так, якщо стовпець або вираз isn ' функціонально не залежать від виразу групування, тоді він може походити з будь-якого рядка в групі).