ネストしたテーブル設計では、1:Nの構造になるレコードが頻発します。
その場合の素朴なSQLは以下のような記述になるでしょう。
SELECT categories.name, articles.title FROM categories
JOIN articles ON categories.id = articles.category_id;
多くの場合、カテゴリー1件に対して記事N件となりますが、このSQLでは、同じカテゴリー名が重複するN行のレコードが返ってきます。
集約関数のarray_agg()
を用いると、N件のレコードを配列に変換できます。
SELECT categories.name, array_agg(articles.title) AS title FROM categories
JOIN articles ON categories.id = articles.category_id
GROUP BY categories.name;
array_agg()
を利用するとネスト構造のデータを1クエリで取得でき、n+1クエリを避けられます。
⁋ 2021/07/23↻ 2024/11/07
中馬崇尋
Chuma Takahiro
Chuma Takahiro