【PostgreSQL】WITH句の使い方(WITH句を複数回使用する方法)

実行環境

■PostgreSQL 12.3
■pgAdmin4

 

WITH句とは

WITH句とは、クエリ内に一時的なテーブルを作ることができる句のことです

VIEWのように仮想的なテーブルを作ることができます。

VIEWについては、以下の記事を参考ください。

【SQL】ビュー(VIEW)とは

2021.04.18

WITH句を使用するメリットは以下の2点です。

繰り返し使用することができる。

SQLのネスト(階層)を減らすことができ、可読性が向上する。

 

WITH句の書き方

WITH句の基本的な記述方法は以下になります。

WITH 新たに作成したテーブル名 AS ( -- 新たに作成したテーブル名は任意の名前
  SELECT カラム名1, カラム名2
  FROM テーブル名
  WHERE 条件
)
SELECT カラム名3, カラム名4
FROM テーブル名, 新たに作成したテーブル名 -- WITH句で定義したテーブル名を記述(WITH句にあるSQLをビューのように使用)
WHERE 条件;

WITH句にあるSQL文は、その後ろにあるSELECT文よりも先に実行されます

 

PostgreSQLでWITH句を使用する

以下のuserテーブルを用いてWITH句を使用していきます。

サンプルコード

WITH testTable AS ( -- testTableという任意の名前を設定
	SELECT COUNT(id) AS count -- 集約関数を使用、別名をcountとしている
	FROM public.user
) 
SELECT count
FROM testTable;

実行結果:

上記のように、WITH句を使用することで一時的に作成したテーブルからデータを抽出することができます。

 

WITH句を複数回使用する方法

ここからは、WITH句を複数回使用する方法について解説していきます。

まずは、新たに2つのテーブルを作成します。

productテーブル

producing_areaテーブル

サンプルコード

WITH PRODUCT AS (
  SELECT Pro.name,
	     Area.area
  FROM public.product Pro
  INNER JOIN public.producing_area Area ON Pro.id = Area.product_id -- 内部結合
), -- カンマでつなぎ、WITHはつけない
LIST AS (
  SELECT string_agg(name, ',') AS fruits_list, -- string_aggで文字列を連結
	     string_agg(area, ',') AS area_list
  FROM PRODUCT
)
SELECT fruits_list, area_list FROM LIST;

実行結果:

上記のように記述することで、WITH句を複数回使用することができます。

ポイントとして、2つ目以降のWITH句には、「 , 」でつなぎ、先頭に「WITH」はつけません

また、WITH句の中では集約関数の「string_agg」を用いて文字列を連結しています。

string_aggの詳しい内容は以下の記事を参考ください。

【PostgreSQL 】string_aggとgroup byで文字列を連結してグループ化する方法

2021.05.23

 

おすすめ書籍・Udemy

■おすすめ入門書①
スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

■おすすめ入門書②
いちばんやさしい SQL 入門教室

■おすすめ入門書③
ゼロからわかる SQL超入門 (かんたんIT基礎講座)

 

■Udemyのおすすめ講座①
はじめてのテーブル設計・データベース設計

■Udemyのおすすめ講座②
3時間で学ぶ SQL ・データベース 超入門

■Udemyのおすすめ講座③
はじめてのSQL ・データ分析入門