Помогите пожалуйста с написанием запроса

Доброго времени суток. Нужна помощь с написанием запроса. Есть 2 таблицы:

people:
id(serial)|surname(character)|name(character)|second_name(character)|notes(text)

phones:
id(serial)|people_id(integer)|phone_number(character)

Нужно написать такой запрос:

Выбирает все записи из таблицы people, а в поле phones заносит все номера телефонов для записи.

Я пытался написать так:

SELECT
	people.*,
	array_agg(phones.phone_number) AS phones	
FROM people
LEFT JOIN
	phones
	ON
		people.id = phones.people_id
GROUP BY
	people.id

но мне выдаёт ошибку "column "people.surname" must appear in the GROUP BY clause or be used in an aggregate function". Я понимаю, что это означает, что в GROUP BY нужно прописать все поля таблицы people, но может есть какой-то другой способ?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Давайте будем логичными. Что

Давайте будем логичными. Что делает группировка GROUP BY? Она "схлопывает" записи с одинаковыми значениями полей, указанными в группировке. Если у вас, например, поле people.surname разное, то и группировать по нему не представляется возможным. Значит либо отказывайтесь от группировки и используйте вместо неё сортировку скажем по people_id чтобы было несколько записей с разными номерами, либо используйте группировку, но при этом перечисляйте в GROUP BY поля таблицы people, который вы хотите видеть.

Можно обойтись и без

Можно и без группировки:

SELECT p.*,
       array(SELECT phone_number
               FROM phones
              WHERE people_id = p.id) AS phones	
  FROM people AS p

PS в 9.1 работает и твой вариант, если конечно по колонке people.id есть ограничение уникальности.

Спасибо за помощь)

Спасибо за помощь)

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023