2016-06-30 15 views
2

Ich habe folgende drei Tabellen in Postgress ...Zusammenführen von zwei json Objekte in postgresql Ansichten/Funktionen

Employee (employee_id, ...) 
Address (address_id, owner_id, ...) 
Address_Component (address_id, key, value) 

während Adresse Komponentendaten hat wie ...

| 123 | province  | Toronto  | 
| 123 | country  | Canada  | 
| 123 | addressLine1 | some address | 

Mitarbeiter mehrere Adressen haben und jede Adresse ist einer Adresskomponente zugeordnet.

Ich möchte Adresse als JSON und Address_Component als ein anderes JSON Embedded innerhalb Adressobjekt haben.

select emp.employee_id, 
    array_to_json(array_agg(row_to_json(adr))) as address, 
    json_object(array_agg(adrcomp.key), array_agg(adrcomp.value)) as address_component 
    FROM employee emp 
    LEFT JOIN address adr ON adr.owner_id = emp.employee_id 
    LEFT JOIN address_component adrcomp ON adr.address_id = adrcomp.address_id 
    WHERE employee_id = 'a6f49ab5-1769-4953-9b0e-6c12754d33c7' 
    GROUP BY emp.employee_id 

Damit ist ich richtig Lage Array von Adressen als json zu bekommen, während ich temporäre Adresse Komponente als separates Ergebnis. Könnten Sie mir helfen, diese address_component json in ein einzelnes Element der Adresse json array zusammenzuführen, um die Ausgabe wie unten zu haben?

[{ address_id:"123", owner_id: "E1", address_component: {province:"", "country":"", addressLine1:""} }, { ... }] 

Antwort

0

Sie können nicht alles auf der gleichen Ebene tun, da Sie zweimal aggregieren. Sie müssen das address_component aus einer eigenen Unterabfrage erstellen:

SELECT emp.employee_id, 
     jsonb_agg((
     SELECT a FROM (
      SELECT adr.address_id, adr.owner_id, 
        (SELECT json_object_agg(key, value) 
        FROM address_component 
        WHERE address_id = adr.address_id) AS address_component) a)) 
FROM employee emp 
LEFT JOIN address adr ON adr.owner_id = emp.employee_id 
WHERE employee_id = 'a6f49ab5-1769-4953-9b0e-6c12754d33c7' 
GROUP BY emp.employee_id