with句を利用したクエリ内テーブル - SQL

with句を利用したクエリ内テーブルの記述方法について紹介します。

概要

複雑なクエリを処理したい場合に、クエリを分割したり、テーブルから事前に該当するレコードを抜き出して、そのレコードに対してクエリを実行したい場合があります。 with文を利用すると、クエリ内テーブルを作成できます。

書式

with文の書式は以下です。
with [クエリ内テーブル名] as (
[クエリ内テーブルのクエリ]
)
[クエリ]

クエリ内テーブルを複数記述する場合は次の書式となります。
with [クエリ内テーブル1の名前] as (
[クエリ内テーブル1のクエリ]
),
[クエリ内テーブル2の名前] as (
[クエリ内テーブル2のクエリ]
),
...
[クエリ内テーブルnの名前] as (
[クエリ内テーブルnのクエリ]
)
[クエリ]

[クエリ]内で[クエル内テーブル名]を利用できます。

以下のテーブルを用意します。
Products
idmodelnameclasscategoryprice
1C-XM01モーダンチェアホームチェア56000
2X-XD05ラージデスクオフィステーブル87000
3A-DA40ラウンドダイニングチェアホームチェア28000
4O-XX100ナチュラルオフィスオフィスチェア13800
5R-D400ラウンドダイニングテーブルホームテーブル128000
6R7000ウッドキャビネットオフィスその他32000
7B-200リネンベッドホームベッド184500
8B-250ホワイトダブルベッドホームベッド324850
9W-80ワーキングチェアオフィスチェア45000
10EG-10Xエルゴノミクスデスクオフィステーブル88500
11OC-908オーガニックチェアホームチェア56000

次のクエリを実行します。
with filter1 as (
select * from Products where category = 'チェア'
)
select * from filter1 where price > 40000

解説

with句でクエリ内テーブルを作成しています。元のProducts テーブルからcategory列の値が "チェア" のレコードを取り出して、filter1 とします。
with filter1 as (
select * from Products where category = 'チェア'
)

filter1 のクエリ内テーブルから、price列の値が 40000より大きいレコードを取り出してクエリの結果とします。
select * from filter1 where price > 40000

実行結果

クエリを実行すると、以下の結果となります。
idmodelnameclasscategoryprice
1C-XM01モーダンチェアホームチェア56000
9W-80ワーキングチェアオフィスチェア45000
11OC-908オーガニックチェアホームチェア56000

whereを一つの句にまとめた以下のクエリと同じ結果になります。
select * from Products where category = 'チェア' and price > 40000

また、サブクエリを利用した以下のSQLとも同じ結果になります。
select * from (select * from Products where category ='チェア') as f where price > 40000

with句のメリット

with句でできることは、where句にまとめることや、サブクエリ、副問い合わせで実現可能です。 with句のメリットとして、サブクエリではクエリ内にクエリを入れ子にして記述する必要がありますが、 with句であれば、クエリの手前に記述できるため、入れ子にせず記述でき、クエリの見通しが良くなります。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
掲載日: 2023-03-26
iPentec all rights reserverd.