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)