Я использую 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_id
aggregated_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
Вам нужно присоединиться к результату 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;
Вы должны нормализовать модель базы данных как минимум до 1NF. Между этими двумя таблицами существует отношение M:N, и для его моделирования вам понадобится третья таблица.