次のような場所テーブルを持つデータベースを使用しています。
locationID | locationHierarchy
1 | 0
2 | 1
3 | 1,2
4 | 1
5 | 1,4
6 | 1,4,5
このような木を作る
1
--2
----3
--4
----5
------6
ここで、locationHierarchy はすべての祖先の locationID の csv 文字列です (階層ツリーを考えてください)。これにより、開始位置 ID を指定してツリーの最上部に向かって作業するときに、階層を簡単に決定できます。
ここで、先祖から開始し、すべての子孫を再帰的に見つけるコードを記述する必要があります。MySQL には、csv 文字列を簡単に解析して値を探す「find_in_set」という関数があります。「セット内の値 4 を見つける」と言うだけで、4 の locationID の子孫であるすべての場所 (4 自体を含む) が得られるので、これは素晴らしいことです。
残念ながら、これは SQL Server 2014 で開発されており、そのような機能はありません。CSV 文字列は可変長 (事実上無制限のレベルが許可されます) であり、場所のすべての先祖を見つける方法が必要です。
find_in_set 関数を SQL Server に模倣するためにインターネットで見つけたものの多くは、最大 4 レベルなどの固定された階層の深さを想定しているため、うまくいきません。
クエリに統合できるストアド プロシージャまたは何かを持っている人はいますか? コードを使用して CSV 文字列を個別に解析するために、このテーブルからすべてのレコードを取得する必要はありません。
locationID% または %,{locationid},% の locationHierarchy 文字列を検索するとうまくいくと思いますが、かなり遅いです。