当查询中有许多其他列时,是否有适当的方法来聚合单个列?
我已经尝试过这个有效的答案,但我的查询变得更加冗长。
我当前的查询如下所示:
SELECT t1.foo1, t1.foo2, t2.foo3, t2.foo4, string_agg(t3.aggregated_field, ', ')
FROM tbl1 t1
LEFT JOIN tbl2 t2 ON t1.id = t2.fkeyid
LEFT JOIN tbl3 t3 ON t2.id = t3.fkeyid
GROUP BY t1.foo1, t1.foo2, t2.foo3, t2.foo4, t2.foo5, t2.foo6
ORDER BY t2.foo5, t2.foo6
查询有更多的字段和LEFT JOIN
s,重要的部分是所有这些字段都具有 1 到 1 或 1 到 0 的关系,除了我要聚合的 1 到 n 的一个字段,t3.aggregated_field
在上面的伪查询中表示。
由于我使用的是聚合函数,SELECT
and中列出的所有字段都ORDER BY
必须是聚合的或GROUP BY
子句的一部分。这使我的查询方式比现在更详细。
也就是说,假设foo1
是一个主键,当这个字段重复时,除此之外aggregated_field
的所有其他字段也相等。我希望这些重复的行作为带有聚合字段值的单行结果。(基本上是select distinct
一个聚合列)
有没有更好的方法来做到这一点(不必将所有其他字段放在 中GROUP BY
)或者我应该只在后端对结果集进行迭代,为获取这种 1 到 n 关系的每一行执行查询?
服务器正在运行 PostgreSQL 9.1.9,更具体地说:
x86_64-unknown-linux-gnu 上的 PostgreSQL 9.1.9,由 gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54) 编译,64 位