我试图在PostgreSQL中使用左连接横向查询来自2个(或更多)表的include结果,对于表entidad a(主表)的每条记录,我需要有一条记录,并且来自表entidad b(主表)的所有记录必须包含在由array agg生成的一个字段中。在这个数组中,我必须删除重复的元素,并且必须在主表中保留order数组。
我需要执行此SQL查询:

SELECT entidad_a_._id_ AS "_id", CASE WHEN count(entidadB) > 0 THEN array_agg(DISTINCT entidadB._id,ordinality order by ordinality)
ELSE NULL END AS "entidadB"
FROM entidad_a_ as entidad_a_, unnest(entidad_a_.entidad_b_) WITH ORDINALITY AS u(entidadb_id, ordinality)
LEFT JOIN LATERAL (
SELECT entidad_b_3._id_ AS "_id", entidad_b_3.label_ AS "label"
FROM entidad_b_ as entidad_b_3
WHERE entidad_b_3._id_ = entidadb_id
GROUP BY entidad_b_3._id_
LIMIT 1000 OFFSET 0
) entidadB ON TRUE
GROUP BY entidad_a_._id_
LIMIT 1000 OFFSET 0

但我有错误。。。。
我怎样才能得到这些结果?
编辑:
我的错误是:
错误:函数AARYAYAGG(整数,BIGITT)不存在
SQL状态:42883
提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。
字符:69
如果查询是:
……数组agg(按顺序排列的不同entidadB.\u id顺序)。。。。。
厄洛尔是:
错误:在具有DISTINCT的聚合中,ORDER BY表达式必须出现在参数列表中
SQL状态:42P10
字符:110
我的问题是array-agg、DISTINCT和ORDER-by的组合

最佳答案

解决了的!!我用自定义聚合创建了postgres扩展。

    CREATE AGGREGATE array_agg_dist (anyelement)
(
    sfunc = array_agg_transfn_dist,
    stype = internal,
    finalfunc = array_agg_finalfn_dist,
    finalfunc_extra
);

正在为此自定义函数创建函数和c代码。

关于postgresql - array_agg DISTINCT和ORDER,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47631038/

10-15 20:48