0

次のような場所テーブルを持つデータベースを使用しています。

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 文字列を検索するとうまくいくと思いますが、かなり遅いです。

4

2 に答える 2

0

最後にそれは私のために働いた..

SELECT * FROM locations WHERE locationHierarchy like CONCAT(@param,',%%')    OR
                                    o.unitnumber like CONCAT('%%,',@param,',%%') OR
                                    o.unitnumber like CONCAT('%%,',@param)
于 2018-05-09T07:45:29.193 に答える