ツリーの閉包モデル リーフの移動、追加で自分への補足 「SQLアンチパターン」より

1月にオライリー・ジャパンより「SQLアンチパターン」が発売されました。
この本で紹介されているツリー構造をRDBMSで扱う手法の一つ「閉包モデル」は初めて知ったのですが、最後の方に出てくるpath_lengthを追加した場合のSQLが掲載されていなかったので、自分のために補足として書き残しておきます。

以下は本に掲載されているリーフを追加する際のSQLですが…

このままではpath_lengthが追加されません。
そこで、以下のようにサブクエリ部分のフィールドで既存レコードのpath_lengthに+1して返すようにすれば、追加されるリーフのpath_lengthは自動で計算されることになります。

また、リーフを移動する際のSQLは以下のように掲載されていますが…

これを以下のようにサブクエリ部分のフィールドでsupertree.path_length + subtree.path_length + 1を返せば、自動的にpath_lengthが計算された状態でリーフが移動されます。

以上、試してないけど、たぶんこれでいけるはず。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です