Почему никакое “ИЗБРАННОЕ нечто.* … GROUP BY foo.id” в Пост-ГРЭС?

При ручном тестировании программного обеспечения у Вас обычно есть маленький набор тестов/действий, которые Вы используете. В конечном счете Вы автоматически превратите свои входные данные или действия так, чтобы Вы провели по себе вокруг известных проблем. Модульные тесты должны быть там, чтобы напомнить Вам, что вещи не работают правильно.

я рекомендую писать тесты перед кодом, добавляя новые тесты/данные для развития функциональности основного кода!

11
задан Sijmen Mulder 17 July 2009 в 00:07
поделиться

3 ответа

Некоторые базы данных более расслаблены по этому поводу , хорошо и плохо. Запрос не конкретный, поэтому результат также не конкретный. Если база данных разрешает запрос, она вернет по одной записи из каждой группы, и ей все равно, какая именно. Другие базы данных более конкретны, и потребовать от вас указать, какое значение вы хотите получить от группы. Они не позволят вам написать запрос с неопределенным результатом.

Единственные значения, которые вы можете выбрать без агрегирования, - это значения из группы с помощью предложения :

select foo.id, count(bar.id)
from foo inner join bar on foo.id = bar.foo_id
group by foo.id

Вы можете использовать агрегаты для получения других значений:

select foo.id, min(foo.price), count(bar.id)
from foo inner join bar on foo.id = bar.foo_id
group by foo.id

Если вам нужны все значения из таблицы foo, вы можете поместить их все в группу с помощью предложения (если это дает правильный результат):

select foo.id, foo.price, foo.name, foo.address, count(bar.id)
from foo inner join bar on foo.id = bar.foo_id
group by foo.id, foo.price, foo.name, foo.address

Или, вы можете присоединиться к таблице с помощью подзапроса:

select foo.id, foo.price, foo.name, foo.address, sub.bar_count
from foo
inner join (
   select foo.id, bar_count = count(bar.id)
   from foo inner join bar on foo.id = bar.foo_id
   group by foo.id
) sub on sub.id = foo.id
5
ответ дан 3 December 2019 в 01:20
поделиться

Какой именно вывод postgresql вы бы получили? Вы используете агрегатную функцию и пытаетесь вывести «что-то».

Ах. Я понимаю, что вы можете сделать. Используйте подзапрос.

select foo.*, (select count(*) from bar where bar.foo_id=foo.id) from foo;

Проверьте и объясните, что план выглядит хорошо. Подзапрос - это не всегда плохо. Я только что проверил базу данных, которую использую, и мой план выполнения был подходящим для этого запроса.

Да, теоретически группировки по foo.id было бы достаточно (то есть: ваш запрос плюс «group by foo.id»). Но очевидно (я это тестировал) postgresql этого не сделает. Другой вариант - «сгруппировать по foo.id, foo.foo, foo.bar,

3
ответ дан 3 December 2019 в 01:20
поделиться

Предложение GROUP BY требует, чтобы каждый столбец, возвращаемый запросом, был либо столбцом, содержащимся в операторе GROUP BY , либо агрегатной функцией (например, как COUNT в вашем примере). Не видя вашего предложения GROUP BY или столбцов foo , трудно сказать, что именно происходит, но я предполагаю, что проблема в том, что foo . * пытается вернуть один или несколько столбцов, которых нет в вашем предложении GROUP BY .

Это действительно общее свойство SQL и не должно быть специфическим для PostgreSQL. Понятия не имею, почему это сработало для вас с SQLite или MySQL - возможно, все столбцы в foo. * на самом деле находятся в вашем предложении GROUP BY , но PostgreSQL может '

1
ответ дан 3 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: