|
Сформировать jsonb из массива строк другой таблицы
|
|||
---|---|---|---|
#18+
Здравствуйте. Только начинаю изучать PostgreSQL, не пинайте сильно. Есть таблицы а) main: stat_id | consolidate integer | jsonb ------------------------------- 10000 | ..... | n | б) stat_value stat_id | func_id | value integer | integer | varchar ------------------------------------------- 10000 | 123 | Значение_1 10000 | 234 | Значение_2 10000 | ... | Значение_3 ... | ... | ... n | m | Значение_n в) func_name func_id | func_name integer | varchar ------------------------------- 123 | name_1 234 | name_2 ... | ... m | name_n Т.е. для каждого stat_id может быть произвольное количество func_id, значения и названия которых определены в таблицах stat_value и func_name. Мне нужно для каждого stat_id собрать в первой таблице jsonb-поле consolidate вида: {"name_1" :{'func_id':123, 'value': "Значение_1"}, "name_2" :{'func_id':234, 'value': "Значение_2"}, ... , "name_n" :{'func_id':m, 'value': "Значение_n"}} Всю голову сломал, документацию читал, не могу реализовать, прошу помочь. Параметров, которые надо в jsonb внести и, соответственно участвующих таблиц, на самом деле больше, но мне сам принцип бы понять на данном упрощенном примере. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2019, 04:24 |
|
Сформировать jsonb из массива строк другой таблицы
|
|||
---|---|---|---|
#18+
Вот такая конструкция, подсказанная в slack-канале Postgres'a : Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
возвращает требуемые значения, а именно объединяет значения в поле jsonb и выводит таблицу (запятые между парами точками заменил на точки, а то редактор их воспринимает как разделитель столбцов): stat_idconsolidate10000{"name_1" :{'func_id':123. 'value': "Значение_1"}. "name_2" :{'func_id':234. 'value': "Значение_2"}. ... . "name_n" :{'func_id':m. 'value': "Значение_n"}}...... Вместе с тем, строится новая итоговая таблица с этими двумя столбцами, а мне нужно записать данные в поле consolidate уже имеющейся. Пробовал так: Код: plsql 1. 2. 3. 4.
ругается что UPDATE не может содержать агрегатную функцию. Пробовал вынести SELECT в блок WHERE: Код: plsql 1. 2. 3. 4. 5. 6.
На этот раз ругается, что GROUP BY не может содержать агрегатную функцию. Если же GROUP BY вообще убрать, то запрос отрабатывает, но возвращает пустые значения в столбце consolidate. Я также не уверен, что запись SET consolidate = consolidate WHERE consolidate = SELECT ... корректна (какое-то масло масляное), однако логичная попытка ввести переменную (SET consolidate = $var WHERE $var = SELECT ... ) в Postgres не работает. Как можно сделать UPDATE в такой ситуации? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2019, 22:25 |
|
|
start [/forum/topic.php?fid=53&msg=39805129&tid=1995231]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 140ms |
0 / 0 |