首頁 >資料庫 >mysql教程 >如何在多列 SQL 查詢中高效聚合單列?

如何在多列 SQL 查詢中高效聚合單列?

DDD
DDD原創
2024-12-16 22:09:18154瀏覽

How Can I Efficiently Aggregate a Single Column in a Multi-Column SQL Query?

在多列表查詢中聚合單列

當您有一個包含多列的查詢並希望聚合時單個特定的列,它可能會帶來挑戰。考慮以下查詢:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn