在多列表查詢中聚合單列
當您有一個包含多列的查詢並希望聚合時單個特定的列,它可能會帶來挑戰。考慮以下查詢:
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
雖然查詢有效,但由於需要在 GROUP BY 和 ORDER BY 子句中列出所有非聚合字段,它變得冗長。出現此約束是因為這些子句中不允許聚合。
幸運的是,對於 PostgreSQL 9.1 及更高版本,有更簡單的解決方案。透過利用主鍵分組的概念,可以大幅簡化查詢:
SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ') FROM tbl1 GROUP BY 1 ORDER BY foo7, foo8; -- had to spell out, since no longer in select list!
但是,如果查詢涉及多個具有複雜關係的表,則採用替代方法可能會更有效。透過先執行聚合,然後連接結果,可以最佳化查詢的非聚合部分:
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 ...
在這種情況下,大部分查詢可以在不進行聚合的情況下繼續進行,從而提高效能。
以上是如何在多列 SQL 查詢中高效聚合單列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!