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 | メイン皿 | 焼き魚 | 300 | 1 |
6 | メイン皿 | からあげ | 350 | 2 |
13 | メイン皿 | おつくり | 400 | 3 |
4 | メイン皿 | ハンバーグ | 400 | 3 |
14 | メイン皿 | ステーキ | 500 | 5 |
1 | 主食 | 白ごはん | 200 | 1 |
3 | 主食 | かやくご飯 | 250 | 2 |
9 | 副菜 | 納豆 | 100 | 1 |
10 | 副菜 | だし巻き卵 | 130 | 2 |
7 | 副菜 | 冷奴 | 200 | 3 |
8 | 副菜 | 煮物 | 240 | 4 |
2 | 汁物 | 季節の味噌汁 | 80 | 1 |
ここから一番安いものだけを抽出する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 | メイン皿 | 焼き魚 | 300 | 1 |
1 | 主食 | 白ごはん | 200 | 1 |
9 | 副菜 | 納豆 | 100 | 1 |
2 | 汁物 | 季節の味噌汁 | 80 | 1 |