[英]return JSON with children postgresql
我希望它以如下方式與其孩子一起訂購的 Json 中返回給我,但我無法解決它
在 postgresql 中有沒有辦法用它們的子模塊訂購父模塊,如果我不明白,我附上一個例子
[
{
"id_module": 1,
"id_parent_module": null,
"module_code": "001.",
"name_module": "Atoridad Fiscal",
"desc_module": "Atoridad Fiscal",
"children": [{
"id_module": 2,
"id_parent_module": 1,
"module_code": "001.002",
"name_module": "Recibidos",
"desc_module": "Recibidos",
},
{
"id_module": 3,
"id_parent_module": 1,
"module_code": "001.003.",
"name_module": "Enviados",
"desc_module": "Enviados",
},
{
"id_module": 4,
"id_parent_module": 1,
"module_code": "001.004.",
"name_module": "Archivados",
"desc_module": "Archivados",
}]
},
{
"id_module": 5,
"id_parent_module": null,
"module_code": "005.",
"name_module": "Configuraciones",
"desc_module": "Configuraciones",
"children": [{
"id_module": 14,
"id_parent_module": 5,
"module_code": "005.14.",
"name_module": "Medios Contacto",
"desc_module": "Medios Contacto",
}]
},
{
"id_module": 5,
"id_parent_module": null,
"module_code": "005.",
"name_module": "Configuraciones",
"desc_module": "Configuraciones",
"children": [{
"id_module": 14,
"id_parent_module": 5,
"module_code": "005.14.",
"name_module": "Medios Contacto",
"desc_module": "Medios Contacto",
}]
},
{
"id_module": 6,
"id_parent_module": null,
"module_code": "006.",
"name_module": "Mensajes",
"desc_module": "Bandeja del contribuyente",
"children": [{
"id_module": 7,
"id_parent_module": 6,
"module_code": "006.007.",
"name_module": "Recibidos",
"desc_module": "Recibidos",
},
{
"id_module": 8,
"id_parent_module": 6,
"module_code": "006.008.",
"name_module": "Enviados",
"desc_module": "Enviados",
},
{
"id_module": 22,
"id_parent_module": 6,
"module_code": "006.0022.",
"name_module": "Buscador de Mensajes",
"desc_module": "Buscador de Mensajes",
}]
}
]
我已經嘗試使用SELECT array_to_json(array_agg(row_to_json(alias))) FROM (select * from my table ) alias
它返回我的 json 但不是它的孩子
如果你的表數據最多有兩層深,那么你只需要使用幾個非遞歸子查詢就可以產生想要的結果; 但是,如果您的數據深度為n
級,則需要使用遞歸cte
來構建嵌套:
with recursive cte(id, p, js) as (
select t.id_module, t.id_parent_module, json_agg(t.jsn)
from (select m.id_module, m.id_parent_module,
json_build_object('id_module', m1.id_module,
'id_parent_module', m1.id_parent_module,
'module_code', m1.module_code,
'name_module', m1.name_module,
'desc_module', m1.desc_module) jsn
from modules m join modules m1 on m1.id_parent_module = m.id_module
where not exists (select 1 from modules m2 where m2.id_parent_module = m1.id_module)) t
group by t.id_module, t.id_parent_module
union all
select t.id_module, t.id_parent_module, json_agg(t.jsn)
from (select m.id_module, m.id_parent_module,
json_build_object('id_module', m2.id_module,
'id_parent_module', m2.id_parent_module,
'module_code', m2.module_code,
'name_module', m2.name_module,
'desc_module', m2.desc_module,
'children', c.js) jsn
from modules m join cte c on m.id_module = c.p join modules m2 on m2.id_module = c.id) t
group by t.id_module, t.id_parent_module
)
select jsonb_pretty(t.result::jsonb) from (
select json_agg(json_build_object('id_module', m2.id_module, 'id_parent_module', m2.id_parent_module, 'module_code', m2.module_code, 'name_module', m2.name_module, 'desc_module', m2.desc_module, 'children', c.js)) result
from cte c join modules m2 on c.id = m2.id_module where c.p is null) t
有關與樣本相同深度的輸入數據的結果,請參見此處。
另請參閱此處,了解對深度> 2
的數據使用的相同查詢。
分階段執行jsonb_agg()
:
with chilluns as (
select id_parent_module,
jsonb_agg(to_jsonb(my_table) order by id_module) as children
from my_table
where id_parent_module is not null
group by id_parent_module
), rents as (
select p.*, c.children
from my_table p
join chilluns c on c.id_parent_module = p.id_module
)
select jsonb_pretty(jsonb_agg(to_jsonb(rents) order by id_module)) as result
from rents;
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.