在 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;
我有以下示例数据:
--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;