Как я могу агрегировать текст из одной таблицы по массиву идентификаторов в другой?

Я использую PostgreSQL 11. У меня есть две таблицы:

Report_template

id (инт) template_blocks_id (целое []) 1 1,2,3 2 3,2,1 3 2,2,3,1 4 3,1

Report_template_block

id (инт) code (текст) 1 Блок №1 2 Блок №2 3 Блок №3 4 Блок №4

Как я могу получить совокупность всех кодов report_template_block, указанных в массиве report_template, в том же порядке?

Я хочу получить это:

report_template_idaggregated_code 1 "Block #1, Block #2, Block #3" 2 "Block #3, Block #2, Block #1" 3 "Block #2, Block #2, Block #3, Block #1" 4 "Block #3, Block #1"

На данный момент у меня есть следующий SQL-запрос, но этот запрос не учитывает повторение report_pattern_block.id:

SELECT report_template.id,
       (select string_agg(code, '\n')
        from report_template_block
        where id = unnest(report_template.template_blocks_id)) as generated_template
FROM report_template

Вы должны нормализовать модель базы данных как минимум до 1NF. Между этими двумя таблицами существует отношение M:N, и для его моделирования вам понадобится третья таблица.

The Impaler 25.11.2022 20:03
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно присоединиться к результату unnest, чтобы повторить ряды:

select rt.id as report_template_id, 
       string_agg(rtb.code, ',' order by b.idx) as aggregated_code
from report_template rt
  cross join unnest(rt.template_blocks_id) with ordinality as b(template_id, idx)
  join report_template_block rtb on rtb.id = b.template_id
group by rt.id
order by rt.id;

Другие вопросы по теме