1:Nのレコードを配列で取得するSQL

ネストしたテーブル設計では、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クエリを避けられます。

中馬崇尋
Chuma Takahiro