Я часто сталкиваюсь с ситуациями, когда у меня есть запрос, подобный этому:
SELECT
a.Id,
a.A,
a.B,
a.C,
SUM(b.Foo) AS foo
FROM
TableA AS a
JOIN TableB AS b
ON a.Id = b.TableAId
GROUP BY a.Id;
В SQL Server (а также MySQL, если ONLY_FULL_GROUP_BY
имеет значение true), этот запрос бесполезен. Все должно быть либо а) в статистической функции, либо б) в GROUP BY
.
Моя проблема в том, что оба решения выглядят плохо и вводят в заблуждение. Если вы выберете случайную статистическую функцию, такую как MAX()
, вы получите:
SELECT
a.Id,
MAX(a.A) AS A,
MAX(a.B) AS B,
MAX(a.C) AS C,
SUM(b.Foo) AS foo
FROM
TableA AS a
JOIN TableB AS b
ON a.Id = b.TableAId
GROUP BY a.Id;
Этот запрос выглядит так, как будто мы заботимся о максимальных значениях a.A
, a.B
и a.C
и скрывает тот факт, что max не имеет смысла.
GROUP BY
немного лучше:
SELECT
a.Id,
a.A,
a.B,
a.C,
SUM(b.Foo) AS foo
FROM
TableA AS a
JOIN TableB AS b
ON a.Id = b.TableAId
GROUP BY a.Id, A, B, C;
но это все еще не оптимально. В большом запросе со сложной группировкой, все эти дополнительные поля затрудняют чтение, и у меня первое впечатление, что здесь есть какая-то дополнительная иерархия группировки, которой на самом деле не существует.
Мой фон в основном находится в MySQL с отключенным ONLY_FULL_GROUP_BY
, поэтому я считаю, что это ограничение в SQL Server не нужно. Хотелось бы, чтобы между ними была какая-то счастливая среда; Для компьютера очень просто взглянуть на этот запрос и увидеть, что поля TableA
не нужно агрегировать, в отличие от любого поля из TableB
(кроме TableAId
).
Есть мысли?