Mr.Tの場所

特攻野郎Aチームじゃないよー

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  253  : 記事  0  : コメント  3733  : トラックバック  52

ニュース

  • 性別:男
  • 猫1:まる
  • 猫2:もろ
  • 猫3:にゃん左部郎
  • タバコ:男は黙ってJPS
[わんくま同盟] C#, VB.NET 掲示板

書庫

日記カテゴリ

2009年9月10日 #

Mr.Tです、こんにちは。

 

Ognacさんのエントリで共通テーブル式(CTE)のことをあげたら、こんなコメントが・・・

http://blogs.wankuma.com/ognac/archive/2009/09/10/181052.aspx#181071

 

 

正直、どこをどう説明したらいいのかわかりませんが、もうめちゃくちゃ安易に使ってます。

#シビアなパフォーマンスを比較的求められないケースがほとんどなので、Indexは?とかそういうのは
#今のところあまり問題になってません。

 

例えば、普通に二つのテーブルを外部結合してるSQLがあったとします。

 

X名簿、Y名簿とも、ID,名前,苗字というフィールドのテーブルとして

select T1.[名前],T1.[苗字] from [X名簿] T1
left join [Y名簿] T2
on T1.ID = T2.ID
where T1.ID<100

 

これに、Y名簿のIDが200未満という条件がついていたとすると、そのままかけば

select T1.[名前],T1.[苗字],T2.[結婚前苗字] from [X名簿] T1
left join (select * from [Y名簿] where ID<200) T2
on T1.ID = T2.ID
where ID<100

 

こんな風になりますよね。

 

私は、(select * from [Y名簿] where ID<200)の部分が長くなるのが非常に見難く感じるので、ここをざくっと

こうしちゃいます。

 

with [Y名簿のID200未満] as (

select * from [Y名簿] where ID<200

)

select T1.[名前],T1.[苗字] from [X名簿] T1
left join [Y名簿のID200未満] T2
on T1.ID = T2.ID
where T1.ID<100

 

withでくくるのは、複数かけるので、

with テーブルA as ()

.テーブルB as ()

,・・・

select * from テーブルA,テーブルB

みたいに、やってますね。

SQLは大きくなるほど、ここで抽出してるのはどういうデータなのかを忘れちゃうので、

こうやって名前付けて出しちゃうのは見た目で結構わかりやすいと個人的にはおもってます。

 

他の人、CTEってどういうときにつかってるんだろ。

posted @ 18:09 | Feedback (188)