SQLの中にSQLを作成するサブクエリ(副問い合わせ)はWITH構文を利用するのが簡単です。結合テーブル数が増えるほど、SQLは複雑になりますが、WITHを使うことで非常にわかりやすくなります。第3者が見た時は久しぶりに自分のコードを見た時に理解が早いので、保守性も上がります。
本記事では、サブクエリの代替になるWITH構文について例を交えて解説いたします。
目次
SQLのWITH句を解説
WITH句はSQL実行結果を仮テーブルに保存できる機能(親子丼の例で解説)
SQL実施環境でSQL実行結果を格納する仮データテーブルを好きな名前で保存することができます。例えば、鶏から親子丼を作る時に鶏から卵に加工した仮テーブルを卵という名前で保存できます。(鶏肉も同様)後は、SQLのJOINをする時に仮テーブル名を指定すれば呼び出すことができます。

実際に1つのデータから複数の仮テーブルを作成して集計するSQLをご紹介します。イメージは下記

WITH句を利用したSQL構文例に使うサンプルファイル
下記データを例にコードをご紹介いたします。
■商品情報ファイル1
カテゴリ | 商品名 | 原価 | 個数 | 在庫金額 | 販売開始日 | 販売終了日 |
---|---|---|---|---|---|---|
1 | カビキラー | 1158 | 1 | 1158 | 2025/01/20 | 2025/03/20 |
元テーブル(商品情報ファイル1)から2つの仮テーブルを作成する例
例えば、カテゴリ毎の在庫金額の合計値SQLは下記 ※実際の項目名を英文字ですがここでは日本語で解説
①カテゴリ毎の在庫金額合計
select
カテゴリ,在庫金額 from 商品情報ファイル
where 販売開始日 = '2025/01/20';
②カテゴリ毎の個数合計
select
カテゴリ,個数 from 商品情報ファイル
where 販売開始日 = '2025/01/20';
WITH利用で2つの仮テーブルを作成する例文
上記①②の構文をwith句を用いて作成します。
with句の基本
- 最初にwith 一時保存したい仮テーブル名 as()として()内にSQLを書く(仮テーブル1)
- 2個目以降の仮テーブルでwithを書く必要はない。その代わり事前にカンマを書く(仮テーブル2)
- 上記1,2を結合時は仮テーブル名を用いてjoin

WITHを利用したコード例(実際のサンプルデータ利用例)
上記①②をWITH句を利用して集計すると下記SQLになります。
with table_1 as (
select
カテゴリ,在庫金額 from 商品情報ファイル
where 販売開始日 = '2025/01/20'),
table_2 as (
カテゴリ,個数 from 商品情報ファイル
where 販売開始日 = '2025/01/20')
select
table_1 .カテゴリ,在庫金額,個数
from table_1
inner join table_2
on table_1 .カテゴリ = table_2 .カテゴリ
()とカンマの位置は漏れや誤記が多いので、うまくいかない場合は確認しましょう。
今回は2つのテーブルを結合するパターンでご紹介しましたが、3つ以上でも同じ処理を繰り返せば大丈夫です。