У меня много отношений между таблицами пользователи и роли (типичный вариант использования). Они связаны между собой с помощью таблицы user_role. Я выполняю следующий запрос:
select
u.id, u.first_name, u.last_name, u.middle_name,
u.email_address, r.id, r.role_code
from
master.user u
left join
master.user_role ur
on ur.user_id = u.id
and ur.is_void = false
left join
master.role r
on r.id = ur.role_id
and r.is_void = false
where u.id = 7 and u.is_void = false
Это приводит к
7;"Multi Role";"First";"Middle";"[email protected]";1;"ST"
7;"Multi Role";"First";"Middle";"[email protected]";2;"TC"
Как агрегировать роли в один столбец json или массива, чтобы в результате получилось:
7;"Multi Role";"First";"Middle";"[email protected]";[{id: 1, role_code : ST}, {id: 2, role_code: TC}]
демонстрация: db <> рабочий пример
SELECT
id,
first_name,
last_name,
middle_name,
email_address,
jsonb_agg(
jsonb_build_object('id', r_id, 'role_code', role_code)
)
FROM
result_table
GROUP BY id, first_name, last_name, middle_name, email_address
jsonb_build_object
, Функции Postgres JSONjsonb_agg
, Агрегатные функции PostgresКонечно, вы также можете использовать тип json
вместо jsonb
; Типы Postgres JSON
Исправьте ваш пример: в вашем запросе в столбце «first_name» указано «Multi Role». Я думаю, это неправильно, не так ли?