サイト管理人Blog

cloudfreeで「さぁ始めましょう♪」

MySQLの勉強:共通表形式CTE CommonTableExpression

2023-11-24 記載
概要 : MySQL8.0で新規導入の共通表形式CTEを学ぶ
関連記事 : MySQLの勉強:WINDOW関数
Keyword : 共通表形式CTE, MySQL

auto_id区分品名価格
1主食白ごはん200
2汁物季節の味噌汁80
3主食かやくご飯250
4メイン皿ハンバーグ400
5メイン皿焼き魚300
6メイン皿からあげ350
7副菜冷奴200
8副菜煮物240
9副菜納豆100
10副菜だし巻き卵130
13メイン皿おつくり400
14メイン皿ステーキ500

上記テーブルに以下のWINDOW関数SQLを発行して下の表が取得できました。

select * , RANK() 
over (PARTITION by 区分 ORDER by 価格) as 安い順 
from t_test;
auto_id区分品名価格安い順
5メイン皿焼き魚3001
6メイン皿からあげ3502
13メイン皿おつくり4003
4メイン皿ハンバーグ4003
14メイン皿ステーキ5005
1主食白ごはん2001
3主食かやくご飯2502
9副菜納豆1001
10副菜だし巻き卵1302
7副菜冷奴2003
8副菜煮物2404
2汁物季節の味噌汁801

ここから一番安いものだけを抽出するSQLを

select * , RANK() 
over (PARTITION by 区分 ORDER by 価格) as 安い順 
from t_test where 安い順=1;

と書けばエラーになります。
#1054 - 列 '安い順' は 'where clause' にはありません。

こういう場合にCTEを用いて以下のように書いて目的のビューを取得することができました。

with cte_g1 as (select * , 
RANK() over (PARTITION by 区分 ORDER by 価格) as 安い順 from t_test) 
select * from cte_g1 where 安い順=1;
auto_id区分品名価格安い順
5メイン皿焼き魚3001
1主食白ごはん2001
9副菜納豆1001
2汁物季節の味噌汁801

投稿へのコメントは コチラ(掲示板) へお願いします。

サイト管理人Blog