PostgreSQL离开了一对多关系的联接查询

问题描述

我有下表

CREATE TABLE employee(id serial PRIMARY KEY,employee jsonb);
CREATE TABLE perks_details(id serial PRIMARY KEY,details jsonb);

insert into employee(employee) values
('{"name": "name1","perks": [
             {"id": 123,"valid_from": "T23:28:56.782Z"},{"id": 456,{"id": 789,"valid_from": "T23:28:56.782Z"}
            ]
  }');

insert into  perks_details(details) values('{"id":123,"detail1":"lorem","detail2":"lorem"}');
insert into  perks_details(details) values('{"id":123,"detail3":"lorem","detail4":"lorem"}');
insert into  perks_details(details) values('{"id":456,"detail5":"lorem","detail6":"lorem"}');

如何在perks_details表和聚合函数中,以employee左连接perks_details的特权ID和ID编写选择查询,以便我的结果数据如下:

{
  "name": "name1","perks": [
    {
      "id": 123,"valid_from": "T23:28:56.782Z","details": [
        {
          "id": 123,"detail1": "lorem","detail2": "lorem"
        },{
          "id": 123,"detail3": "lorem","detail4": "lorem"
        }
      ]
    },{
      "id": 456,"details": [
        {
          "id": 456,"detail5": "lorem","detail6": "lorem"
        }
      ]
    },{
      "id": 789,"details": []
    }
  ]
}

我尝试了多种变体,无法接近有效的查询。请在这里建议/协助我。

更新我有查询,其中包含左联接,但结果不是我期望的


    select e.id,perk,perks_details.details
      from employee AS e,jsonb_array_elements(employee->'perks') perk
    LEFT JOIN perks_details on perks_details.details -> 'id' = perk->'id'
      group by e.id,perk.value,perks_details.details;

解决方法

嗨,您可以通过以下方式做到这一点:

with cte as (
select t1.employee->>'name' "name",t2.id,t2.valid_from,json_agg(t3.details) "details" 
from employee t1
cross join lateral jsonb_to_recordset(employee->'perks') as t2(id int,valid_from time)
left join perks_details t3 on t2.id::text=t3.details->>'id'
group by 1,2,3
)

select row_to_json(t) from (
select 
name,json_agg(jsonb_build_object('id',id,'valid_from',valid_from,'details',details)) "perks" 
from cte group by name
) t

DEMO

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...