1

T-SQLツリー検索

親の下にある場合は、ノードのセットから選択します

MSSQL Db(80000+)レコードに非常に大きなツリーがあります。LIKE私のクライアントは、テキストコマンドを介してツリーのクイック検索を要求しました。このLIKEコマンドは500レコード未満を返します。

それぞれのツリーをすばやくチェックして、特定のノードの下にあるかどうかを確認する再帰コマンドはありますか?

編集:しかし、それはかなり明確だと思いました...。

私はSQLServer2005を使用しています。

Table Schema
 - (pK) Id
 - (fK) ParentId
 - FirstName
 - LastName

いくつかのレベルをすばやく下げることができる再帰呼び出しがあります。ただし、名前検索を実行するには、ツリー全体をポーリングする必要があります。これは、数百レベルの深さになる可能性があり、オプションではありません。最初にテーブル全体で名前の一致を検索し、問題のツリーの一部ではないレコードをフィルタリングできるように、クエリの設計に役立つことを期待していました。

4

2 に答える 2

2

再帰的な CTE でこれを行うことができます -- コード例が必要ですか?

このように(このコードはテスト済みです)

WITH recurseTree AS
(
   SELECT * 
   FROM tableName
   WHERE Id = @parentID
   UNION ALL
   SELECT c.*
   FROM tableName c
   JOIN recurseTree p ON c.parentID = p.id
)
SELECT * 
FROM recurseTree

注 : 最近のバージョン (2008 以降)では、高速なツリー トラバーサルを行うための特別なデータ型 ( hierarchyid ) が提供されます。これはおそらく最善の方法であり、他の方法ではそれほど速くはなりません。アップグレード!!

于 2012-08-01T15:22:12.223 に答える
1

これはあなたを助けるはずです:

;WITH CTE AS
(
    SELECT Id, ParentId, FirstName, LastName
    FROM YourTable
    UNION ALL
    SELECT B.Id, B.ParentId, B.FirstName, B.LastName
    FROM CTE A 
    INNER JOIN YourTable B
    ON A.ParentId = B.Id
)
SELECT *
FROM CTE
WHERE FirstName LIKE '%something%'
OPTION(MAXRECURSION 0)
于 2012-08-01T15:38:15.930 に答える