首页 > 解决方案 > Postgresql,如何选择没有重复行的json对象

问题描述


我试图找出如何获取所选行的 JSON 对象结果,而不是显示重复的行。
我目前的查询:
SELECT DISTINCT ON (vp.id) jsonb_agg(jsonb_build_object('affiliate',a.*)) as affiliates, jsonb_agg(jsonb_build_object('vendor',vp.*)) as vendors FROM
affiliates a
INNER JOIN related_affiliates ra ON a.id = ra.affiliate_id
INNER JOIN related_vendors rv ON ra.product_id = rv.product_id
INNER JOIN vendor_partners vp ON rv.vendor_partner_id = vp.id
WHERE ra.product_id = 79 AND a.is_active = true
GROUP BY vp.id

我从中收到的结果是:

[
affiliates: {
affiliate: affiliate1
affiliate: affiliate2
},
vendors: {
vendor: vendor1,
vendor: vendor1,
}

正如您在第二条记录中看到的, vendor 仍然是 vendor1 因为没有更多结果,所以我也想知道是否有办法删除重复项。
谢谢。

标签: postgresql

解决方案


第一点:您在上面显示的结果不符合 json 类型:键没有双引号,字符串值没有双引号,在同一个 json 对象中有重复的键 ('{"affiliate":" affiliate1", "affiliate": "affiliate2"}' :: json) 不接受 jsonb 类型(但它是 json 类型)。

第二点:可以尝试DISTINCT直接在jsonb_agg函数中添加关键字:

jsonb_agg(DISTINCT jsonb_build_object('vendor',vp.*))

并删除该DISTINCT ON (vp.id)子句。

您还可以直接在任何聚合函数中添加 ORDER BY 子句。有关详细信息,请参阅手册


推荐阅读