Theo một nghĩa nào đó, cấu trúc của truy vấn tương tự như kết quả:
select json_agg(children)
from (
select
json_build_object(
'id', lvl1,
'children', json_agg(children order by lvl1)) as children
from (
select
lvl1,
json_build_object(
'id', lvl2,
'children', json_agg(items order by lvl2)) as children
from (
select
lvl1,
lvl2,
json_build_object(
'id', lvl3,
'items', json_agg(item order by lvl3)) as items
from my_table
group by lvl1, lvl2, lvl3
) s
group by lvl1, lvl2
) s
group by lvl1
) s;
Lưu ý, order by
trong các tập hợp là không cần thiết vì thứ tự của một mảng json là không xác định. Tôi đã thêm chúng để có được kết quả chính xác như mong đợi.