
今回は、前回の記事に引き続いて、SQL-Server 2008 Expressの再帰クエリーについて書かせていただきます。
再帰クエリーは非常に便利。いや、それどころか、無いと実現が困難な処理も多々あります。
特に、再帰クエリーじゃないと書くのが困難な処理と言えば、やはりデータの階層構造を求める処理ではないでしょうか。
たとえば、製品がどんな部品で構成されているかの階層情報や、身近な例で言えば、電子掲示板の書き込みのレスのつながりとかでしょうね。
再帰が活躍するポイントは、これらの、何階層つながっているのか分からない情報に対処できるという点です。

今回私が作ってみたサンプルですが、自分のID(MY_ID)、親のID(PARENT_ID)を持ったテーブルから階層情報を生成します。
自分のIDは、親のIDとつながり、その親はそのまた親のIDとつながり・・・を情報が尽きるまで繰り返すわけです。
最上位の親は、親のIDに「何もない」事を明示する0をセットしています。これで最上位である事を識別可能にしてあります。

サンプルでは、次のようなテキストで階層情報を表現します。
親のID>次のID>自分のID
共通テーブル式CTEの内部では、自分自身(CTE)を呼び出しますが、その際にデータテーブルの親IDと、CTEの自分のIDをINNER JOIN句で紐付けて次の情報を手繰り寄せているのがポイントです。
もしも、繰り返しの回数が固定されているのであれば、無理やりにでもプログラムを組む事は可能なのですが、いかんせん、何階層か分からないという状態では、どうしても再帰処理が必要です。
私が仕事で使っているSQL-Server 2000は、企業向けの最上位エディションであろうとも、再帰クエリーは存在しないので、フリーでありながらSQL-Server 2008 Expressには深く感動させられます。
しかも、SQL-Server 2008 Expressですが、今や、安くて良いモバイルノート「Aspire 1410」と64bitのWindows7上で好きに使える時代なんですよね。
目頭が熱くなりますね・・・。いい時代だよぉ・・・。