愚者の経験

「また今度」はほとんどこない

カテゴリーアーカイブ: 小技

[SQL Server][SQL][Tips]cteを使おう!としてみたが難しい。その2

cteに機能の再帰ですが実際何に使えるのかというとほとんど
・連続データの作成
になると思います。マスタなどに親コードみたいなみたいなものが
存在し、順番に追って最上位を取得するという場合にも再帰は役に立ちます。
が、あまりそのような状況に巡り合わないのでそれの説明は省きます。

with cte(inc) as (
	select 1
	union all
	select inc+1
	from cte
	where inc<30
)
select *
from cte

これで1~30までの連続データができます。
年間カレンダーを作るときなどにも使えますね。
注意しなければならない点としては
・100を超える再帰をする場合そのままではエラーになるのでoption (maxrecursion N)が必要

with cte(inc) as (
	select 1
	union all
	select inc+1
	from cte
	where inc<200
)
select *
from cte
option (maxrecursion 0)

・パラメータ等使って回転数を制御した場合等で0行を返すことはできない

declare @maxinc int
set @maxinc=0;
with cte(inc) as (
	select 1
	union all
	select inc+1
	from cte
	where inc<@maxinc
)
select *
from cte

こういうのですね…初期アンカーがある(select 1)ので
1行は必ず返ります。最後のselectにwhere句つけてください。

広告