T-SQL Tree Search Выберите из набора узлов, если они находятся под родительским

T-SQL Tree Search

Выберите из набора узлов, если они находятся под родителем

У меня очень большое дерево в записях MSSQL Db (80000+). Мой клиент запросил быстрый поиск дерева по тексту LIKE команда. LIKE команда возвращает < 500 записей.

Есть ли какая-нибудь рекурсивная команда, которая быстро проверит дерево каждого из них, чтобы увидеть, находятся ли они под определенным узлом?

Редактировать: Я думал, что это было довольно ясно, однако....

Я нахожусь на SQL Server 2005.

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

У меня есть рекурсивные вызовы, которые могут быстро пройти несколько уровней. однако, чтобы выполнить поиск по имени, я должен был бы опросить все дерево, которое может иметь глубину в несколько сотен уровней, и это не вариант. Я надеялся на помощь в разработке запроса, чтобы я мог сначала выполнить поиск по всей таблице на предмет соответствия имени и отфильтровать записи, которые не являются частью рассматриваемого дерева.

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+) предоставляют вам специальный тип данных ( иерархию) для быстрого обхода дерева. Вероятно, это будет лучший путь, все остальное не будет таким быстрым. Обновить!!

Это должно помочь вам:

;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)
Другие вопросы по тегам