Как написать запрос в PostgreSql, чтобы получить в результате двойно вложенный json?

Как написать запрос (используя функции типа row_to_json, json_build_object и подобные) для получения таблицы или представления, которая будет содержать данные из нескольких таблиц (houses, document, files), где файлы сгруппированы по документам, а документы - по домам, в виде документа в формате JSON? БД - PostgreSQL.
  • 2 ноября 2023 г. 15:58
Ответы на вопрос 2
В данном случае можно использовать функции json_agg и json_build_object для создания дважды вложенного JSON. Вот пример запроса, который собирает данные из таблиц houses, documents и files и формирует двойно вложенный JSON:

```sql
SELECT json_agg(json_build_object(
        'house', json_build_object(
            'house_id', houses.house_id,
            'address', houses.address,
            'documents', json_agg(json_build_object(
                'document_id', documents.document_id,
                'document_name', documents.document_name,
                'files', json_agg(json_build_object(
                    'file_id', files.file_id,
                    'file_name', files.file_name
                ))
            ))
        )
    ))
FROM houses
JOIN documents ON documents.house_id = houses.house_id
JOIN files ON files.document_id = documents.document_id
GROUP BY houses.house_id;
```

В этом запросе мы сначала собираем данные из таблиц houses, documents и files, затем группируем их сначала по house_id, затем по document_id, используя функции json_agg и json_build_object для формирования вложенного JSON.

Результатом будет таблица или представление с колонкой, содержащей дважды вложенный JSON.
1. Группируйте записи в таблице tbl с использованием двух параметров - house_id и doc_id, и объедините соответствующие значения в json-объект. Например:

with a as (
    select 
        house_id, 
        doc_id, 
        json_agg(json_build_object('doc_name', doc_name, 'file_id', file_id, 'file_path', file_path)) j
    from tbl
    group by house_id, doc_id
) 

2. Затем выполните группировку данных по параметру house_id и объедините json-объекты в массив. Например:

select house_id, json_agg(j)
from a
group by house_id;

3. Подробное объяснение кода с примерами доступно по ссылке: [ссылкa](https://sqlize.online/sql/psql15/84856c35bf40811de...).
Похожие вопросы