Готовы к загрузке и группированию в PostgreSQL - PullRequest
2 голосов
/ 30 августа 2011

Я знаю, что в отличие от MySQL, PostgreSQL требует перечислять все выбранные поля в предложении group by при использовании агрегатных функций, например,

Transaction.select('sum(amount), category_id').group('category_id')

Достаточно справедливо.Но когда я пытаюсь загрузить ассоциацию, например,

Transaction.select('sum(amount), categories.name').includes(:category).group('categories.name')

, она не работает, потому что вы не включили все поля обеих моделей в группу group by.

Есть ли способ избежать перечисления всех полей моделей или я должен рассмотреть возможность принятия N + 1 запросов?(Я не думаю, что перечисление 30 полей имеет смысл, когда мне нужно только 2 ...)

1 Ответ

1 голос
/ 22 марта 2013

Начиная с новых версий PostgreSQL (9.1+, если я правильно помню), вы можете группировать только по первичным ключам таблиц.Предыдущие версии (и большинство СУБД) также требуют предоставления всех столбцов.Исключение только для ключа работает, потому что мы знаем, что все атрибуты функционально зависят от ключа, поэтому, если ключ изменится, другие атрибуты все равно будут различаться.

MySQL является исключением, как Фрэнк указал в комментариях выше,Это ответственно за многие недетерминированные аспекты этой базы данных в подобных случаях.Недетерминированный, как правило, плохо и его следует избегать.

...