Избегайте указания каждого поля таблицы в предложении GROUP BY при использовании Left Join - PullRequest
4 голосов
/ 10 марта 2012

У меня есть простая база данных SQL Server 2008 с двумя таблицами, подобными этой:

TableA: 
    (PK)"ID"
    "Field"

и

TableB:
    (PK)"ID"
    (FK)"ID_TableA"
    "Field"

Я хочу выбрать все поля в TableA, а также количество соответствующих строк в TableB для каждой строки TableA:

SELECT A.*, 
       COUNT(B."ID") as "B's number"
FROM "TableA" A
LEFT JOIN "TableB" B ON (A."ID" = B."ID_TableA")
GROUP BY A."ID", A."Field"

Это хорошо работает, но у меня есть такая проблема: если TableA будет дополнительно изменен (скажем, нам нужно добавить еще один столбец Field2), я должен обновить приведенный выше оператор SELECT, чтобы включить это поле в GROUP BY пункт. В противном случае я получаю эту ошибку при выполнении операции:

" Столбец TableA.Field2 недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY "

Есть ли способ избежать этого, чтобы я мог изменить свой TableA, не обновляя также все операторы, подобные приведенному выше?

Ответы [ 3 ]

5 голосов
/ 10 марта 2012

Вы можете использовать это (сначала Group By в таблице B, затем присоединитесь к таблице A):

SELECT A.*, 
       COALESCE("B's number", 0) AS "B's number"
FROM "TableA" A
  LEFT JOIN 
    ( SELECT B."ID_TableA", COUNT(B."ID") as "B's number"
      FROM "TableB" B 
      GROUP BY B."ID_TableA"
    ) AS B ON (A."ID" = B."ID_TableA")
1 голос
/ 10 марта 2012

Во-первых, это плохая идея использовать *, чтобы новые столбцы не ломали вещи. Но я думаю, что вы могли бы сделать это и получить желаемый результат без указания столбцов A:

SELECT
  A.*, 
  COUNT(B."ID") OVER (PARTITION BY B."ID_TableA") as "B's number"
FROM "TableA" A
LEFT JOIN "TableB" B ON (A."ID" = B."ID_TableA")
1 голос
/ 10 марта 2012

Вы можете использовать коррелированный подзапрос, подобный этому

SELECT A.*
       , (SELECT COUNT(*) FROM "TableB" WHERE "ID_TableA" = A."ID") AS "B's number"
FROM "TableA" A

Обычно механизм db оптимизирует их, чтобы соответствовать (или превзойти) производительности соединения.

...