当查询中有许多其他列时,是否有适当的方法来聚合单个列?
我试过这个有效的答案,但我的查询变得更加冗长。
我当前的查询如下所示:
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 JOINs,重要的部分是所有这些字段都具有 1 到 1 或 1 到 0 的关系,除了我想要聚合的一个 1 到 n 的字段,t3.aggregated_field在上面的伪查询中表示。
当我使用聚合函数时,SELECT和 中列出的所有字段都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 位
PostgreSQL 9.1.9
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
简单查询 对于 PostgreSQL 9.1 或更高版本,这可以简单得多。正如在这个密切相关的答案中所解释的:
PGError:错误:对象及其 has_many 对象的 AR 查询的 WHERE 子句中不允许聚合 一个表GROUP BY的主键就足够了。自从:
foo1 是主键
..您可以将示例简化为:
SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ') FROM tbl1 GROUP BY 1 ORDER BY foo7, foo8; -- have to be spelled out, since not in select list!
多表查询 但是,由于您有:
更多的字段和 LEFT JOIN,重要的部分是所有这些字段都具有 1 到 1 或 1 到 0 的关系,除了我想要聚合的 1 到 n 的一个字段
..首先聚合应该更快更简单,然后加入:
SELECT t1.foo1, t1.foo2, ... , t2.bar1, t2.bar2, ... , a.aggregated_col FROM tbl1 t1 LEFT JOIN tbl2 t2 ON ... ... LEFT JOIN ( SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col FROM agg_tbl a ON ... GROUP BY some_id ) a ON a.some_id = ?.some_id ORDER BY ...
这样,您的大部分查询根本不需要聚合。