今日は連投。
これを書いたら寝ます(w
#元チャッターの癖かしら?夜中にアクティブになっちゃうのよねぇ(^^;
?
2回ほど”再帰クエリ”についての内容を書かせていただいていますが、
そこに出てきた
With XXX AS ( ~)
には ”共通テーブル式(CTE)”という名前があります。
再帰クエリに使用していたものは”再帰共通テーブル式”や”再帰CTE”と言われています。
共通テーブル式は再帰だけにしか使えないのか?っていうと
そういうわけではありません。
”非再帰共通テーブル式”、”非再帰CTE"もとても便利だったりします。
?
たとえば、良くある N~M件を取得するってもので、
ROW_NUMBER関数を使い行番号を付加→付加した番号に対し、絞込みをする。
ってSQLを書くとします。
以下の2パターンでどちらが見やすいですか?
| (1) |
(2) |
select id, val, pid
from
(
select
row_number() over (order by id) as num , id ,val, pid
from testrc
) as query
where num between 20 and 29
|
with query as
(
select
row_number() over (order by id) as num , id ,val, pid
from testrc
)
select
id , val, pid
from query
where num between 20 and 29
|
(1)は従来どおりに、FROM句でSELECTを発行し、その結果に対しqueryというテーブル名をつけたものです。
(2)は非再帰CTEを使って、(1)でFROM句に書いているものを with queryで外に出しにしたものです。
どちらが内容を把握できて、理解しやすいでしょうか?
?
もう1例だけ比較内容を挙げてみましょう。
| (1) |
(2) |
(3) |
select avg(val)
from
(
select
sum(val) as val
from
tsum group by name
) t
where val >= 500 ;
|
select avg(val)
from
(
select
sum(val) as val
from
tsum group by name
having sum(val) >= 500
) t ;
|
with query as
(
select name , sum(val) as val from tsum group by name
)
select
avg(val)
from query
where val >= 500 ;
|
さて、この記事を読んでいるあなたにとって
一番解析しやすいSQLはどれでしたか?
共通テーブル式(CTE)は使い方によって、
複雑だったSQLをすっきりわかりやすくする事も出来ます。
?
CTEについて興味をもたれた方へ。
MSDNでのCTEページはこちらになります。
http://msdn2.microsoft.com/ja-jp/library/ms175972.aspx
CTEにはたくさんの可能性があると思うので、ぜひ活用してみてください。
共通CTEはSQLServerでは2005からの機能なので、2000以前の方は従来どおりネストしてくださいね・・・。
?