データベースに格納されているグループ(フォルダー)のフルパスのリストを取得する必要があります。
select * from groups;
group_id parent_group_id name
-------- --------------- -------------------------------
1 NULL Root
2 1 Folder1
3 2 Folder2
4 3 Folder3
グループの可能な深さに制限はありません(ほぼ無期限にネストされる可能性があります)ので、レベルをいくつ持つことができるかを事前に知りません。
クエリから次の結果を取得し、それをテーブルにロードして、他のクエリでgroup_idsとフルパスを結合するために使用できるようにしたいと思います。
group_id path
-------- --------------------------------------------
1 /Root
2 /Root/Folder1
3 /Root/Folder1/Folder2
4 /Root/Folder1/Folder2/Folder3
私は同様のニーズを持つ他のいくつかの例を見てきましたが、それが私が望むものに完全に適合することは決してないようであり、明確な例がなければ、私はそれを一人で行うのに苦労しています。
私が考えることができた唯一のことは、同じテーブルのエイリアスを最大レベル数まで結合することでした。これは多くの場合があり、それは実用的ではありません。グループごとに何とか再帰的にループしてツリーを上に移動し、最後になるまで変数にパスを追加してから、最も深い子IDとそのフルパスをテーブルに格納する方法が必要になります。
パフォーマンスも非常に重要です。これは本番データベースであり、速度を落とす余裕はありません。そのため、必要なときにのみダンプして、静的データを再利用したいと考えています。最終的には、それぞれがgroup_idにリンクしている何千ものレコードをダンプし、それらのフルパスを出力したいと思います。
すべてを無料で提供せずに、誰かが私を正しい方向に向けて、コピー元の一般的な例を教えてもらえますか?
SQL Server2008R2を使用しています。