在 json_agg 内添加不同

Add distinct within json_agg

我有以下示例数据:

--EmpMap:

create table EmpMap 
(
   id int
);

insert into EmpMap values(1),(2),(3);

--员工信息:

create table EmpInfo
(
    empid int,
    empname varchar
);

insert into empinfo values(1,'Mak'),(2,'Jack'),(3,'John');

--员工地址:

create table EmpAdd
(
   EmpID int,
   Address varchar
);

insert into EmpAdd values(1,'Addr1'),(1,'Addr1'),(1,'Addr1'),(2,'Add2'),(3,'Add3'),(2,'Add2');

查询:

select e.ID,
       count(1) as Counts,
       json_agg
       (
            json_build_object
            (
            'EmpID',ei.EmpID,
            'EmpAdd',ea.address
            )
       ) as emp_json_address
from empmap e
join EmpInfo ei on e.id = ei.empid
join empadd ea on ei.empid = ea.empid
group by e.ID;  

输出:

id|counts|emp_json_address                                                                                         |
--|------|---------------------------------------------------------------------------------------------------------|
 1|     3|[{"EmpID" : 1, "EmpAdd" : "Addr1"}, {"EmpID" : 1, "EmpAdd" : "Addr1"}, {"EmpID" : 1, "EmpAdd" : "Addr1"}]|
 2|     2|[{"EmpID" : 2, "EmpAdd" : "Add2"}, {"EmpID" : 2, "EmpAdd" : "Add2"}]                                     |
 3|     2|[{"EmpID" : 3, "EmpAdd" : "Address3"}, {"EmpID" : 3, "EmpAdd" : "Add3"}]                                                                       |

预期输出:

id|counts|emp_json_address                                                              |
--|------|------------------------------------------------------------------------------|
 1|     1|[{"EmpID" : 1, "EmpAdd" : "Addr1"}]                                           |
 2|     1|[{"EmpID" : 2, "EmpAdd" : "Add2"}]                                            |
 3|     2|[[{"EmpID" : 3, "EmpAdd" : "Address3"}, {"EmpID" : 3, "EmpAdd" : "Add3"}]     |

这就是聚合函数中 DISTINCT 关键字的作用:

json_agg (DISTINCT
   jsonb_build_object (...)
)

然后将删除重复条目。

注意:您必须使用 jsonb_build_object 而不是 json_build_object,因为 json.

没有相等运算符

json部分与此无关。

此外,您的输出与您在 EmpAdd 部分添加的内容不匹配。

ea.address 添加到 group by

select e.ID,
       count(1) as Counts,
       json_agg
       (
            json_build_object
            (
            'EmpID',ei.EmpID,
            'EmpAdd',ea.address
            )
       ) as emp_json_address
from empmap e
join EmpInfo ei on e.id = ei.empid
join empadd ea on ei.empid = ea.empid
group by e.ID, ea.address;