2

私はポストグレスに次の3つのテーブルを持っています...

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

住所コンポーネントには次のようなデータがあります...

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

従業員は複数の住所を持つことができ、各住所は 1 つの住所コンポーネントに関連付けられます。

address を json として、 address_component を別の json としてアドレス オブジェクト内に埋め込みたいと考えています。

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

これにより、アドレスの配列をjsonとして正しく取得できますが、一時的にアドレスコンポーネントを別の結果として取得できます。この address_component json を address json 配列の個々の要素にマージして、以下のような出力を得ることができますか?

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

1 に答える 1

0

2 回集計しているため、同じレベルですべてを実行することはできません。address_component独自のサブクエリからを作成する必要があります。

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
于 2016-07-01T02:50:38.200 に答える