परिणामस्वरूप पदानुक्रमित संरचना प्राप्त करने के लिए आपको एक पदानुक्रमित क्वेरी बनाना चाहिए।
आप चाहते हैं कि एक ही json ऑब्जेक्ट में कई लोग हों, इसलिए <का उपयोग करें। कोड>json_agg() एक जेसन सरणी में व्यक्तियों को इकट्ठा करने के लिए। समान रूप से, एक व्यक्ति के पास कई कारें हो सकती हैं और आपको एक व्यक्ति से संबंधित कारों को एक जेसन सरणी में रखना चाहिए। यही बात कारों और पहियों पर भी लागू होती है।
select
json_build_object(
'persons', json_agg(
json_build_object(
'person_name', p.name,
'cars', cars
)
)
) persons
from person p
left join (
select
personid,
json_agg(
json_build_object(
'carid', c.id,
'type', c.type,
'comment', 'nice car', -- this is constant
'wheels', wheels
)
) cars
from
car c
left join (
select
carid,
json_agg(
json_build_object(
'which', w.whichone,
'serial number', w.serialnumber
)
) wheels
from wheel w
group by 1
) w on c.id = w.carid
group by personid
) c on p.id = c.personid;
(स्वरूपित) परिणाम:
{
"persons": [
{
"person_name": "Johny",
"cars": [
{
"carid": 1,
"type": "Toyota",
"comment": "nice car",
"wheels": [
{
"which": "front",
"serial number": 11
},
{
"which": "back",
"serial number": 12
}
]
},
{
"carid": 2,
"type": "Fiat",
"comment": "nice car",
"wheels": [
{
"which": "front",
"serial number": 21
},
{
"which": "back",
"serial number": 22
}
]
}
]
},
{
"person_name": "Freddy",
"cars": [
{
"carid": 3,
"type": "Opel",
"comment": "nice car",
"wheels": [
{
"which": "front",
"serial number": 3
}
]
}
]
}
]
}
यदि आप नेस्टेड व्युत्पन्न तालिकाओं से परिचित नहीं हैं तो आप सामान्य तालिका अभिव्यक्तियों का उपयोग कर सकते हैं। यह संस्करण दर्शाता है कि क्वेरी को सबसे नेस्टेड ऑब्जेक्ट से उच्चतम स्तर की ओर शुरू किया जाना चाहिए:
with wheels as (
select
carid,
json_agg(
json_build_object(
'which', w.whichone,
'serial number', w.serialnumber
)
) wheels
from wheel w
group by 1
),
cars as (
select
personid,
json_agg(
json_build_object(
'carid', c.id,
'type', c.type,
'comment', 'nice car', -- this is constant
'wheels', wheels
)
) cars
from car c
left join wheels w on c.id = w.carid
group by c.personid
)
select
json_build_object(
'persons', json_agg(
json_build_object(
'person_name', p.name,
'cars', cars
)
)
) persons
from person p
left join cars c on p.id = c.personid;