共通テーブル式(CTE) (SQL:13060)

Questions
共通テーブル式という、名前からは想像がつきにくいものですが、副問い合わせの親戚のような感じです。 実行結果は、副問い合わせと同じような結果になります。
 書き方は、副問い合わせと全く異なるのですが、CTEで記述すると非常にすっきり表現できます。そのため、場合にもよりますが、私は好んで利用します。

 こちら、AKBのタグが付いた人の一覧出力クエリです。
Select * From 
 T_alocate A
left Outer join
M_tag M
 on
A.tagid=M.tagid
Where M.name Like '%AKB%'
 だいぶごちゃごちゃしていますが、この状態でさらに「useridが2で終わる」という条件を付けくわえてみます。
Select * From 
 T_alocate A
left Outer join
M_tag M
on
A.tagid=M.tagid
Where 
 M.name Like '%AKB%'
 and A.userid Like '%2'
 「useridが2で終わる」が主目的の場合わかりにくいと思いませんか? ※Appendixを開いてください。
Up:2021/08/29
Re:2021/09/09

Appendix
Click!
CTEを使うと、このような「ごちゃごちゃ」したクエリが、結構すっきりに書換えれるようになります。
 CTEは複雑なクエリを一度部品化したような扱いにし、再利用できるようにします。※一回しか使わなくても再利用です。
 元のテーブルをCTEで書き換えると、以下のようになります。
With BASE as(
Select * From 
 T_alocate A
left Outer join
M_tag M
 on
A.tagid=M.tagid
Where M.name Like '%AKB%'
) 
Select * From BASE
 ごちゃごちゃ感があまり変わってないように見えた方はこのように二つに分割してみてください。
With BASE as(
Select * From 
 T_alocate A
left Outer join
M_tag M
 on
A.tagid=M.tagid
Where M.name Like '%AKB%'
) 
          +
Select * From BASE
 ごちゃごちゃしていた部分が【BASE】にまとめられています。このBASEに対してWhere 区をかけるだけで良くなったのです。
Select * From BASE Where userid Like '%2'
 実際にはこれだとだめですが、すっきりになったと思いませんか?
input欄のSQLにuserid Like '%2'を付け加えて完成させてみてください。
超初級
初級
中級
上級
特殊
演習
超初級
初級
中級
上級
特殊
演習
aaaa