Более эффективный метод для захвата всех дочерних единиц - PullRequest
0 голосов
/ 07 апреля 2010

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

Есть ли способ получить sql, чтобы найти все дочерние объекты? Если так, то как?

Использование: Microsoft SQL Server Management Studio Express 9.00.2047.00

Ответы [ 3 ]

2 голосов
/ 07 апреля 2010

Посмотрите на использование Sql Server 2005 CTE .

DECLARE @Table TABLE(
        ID INT,
        Val VARCHAR(10),
        ParentID INT
)

INSERT INTO @Table SELECT 1, 'A', NULL
INSERT INTO @Table SELECT 2, 'B', NULL
INSERT INTO @Table SELECT 3, 'C', 1
INSERT INTO @Table SELECT 4, 'D', 1
INSERT INTO @Table SELECT 5, 'E', 4
INSERT INTO @Table SELECT 5, 'F', 2

;WITh Parents AS (
    SELECT  *,
            CAST(Val + '/'  AS VARCHAR(100))PathVal
    FROm    @Table
    WHERE   ParentID IS NULL
    UNION ALL
    SELECT  t.*,
            CAST(p.PathVal + t.Val + '/' AS VARCHAR(100))
    FROM    @Table t INNER JOIN 
            Parents p ON t.ParentID = p.ID
)
SELECT  *
FROM    Parents

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

MAXRECURSION подсказка для запроса

0 голосов
/ 07 апреля 2010

Я бы предложил что-то вроде Модель вложенного набора .

Идея состоит в том, чтобы сохранить дополнительные два целых числа (обычно называемые «левым» и «правым») для каждого узла, рассчитанные в соответствии с системой, о которой вы можете прочитать подробнее, перейдя по ссылке. Тогда запросы для всех потомков произвольного узла становятся тривиальными.

Редактировать: Здесь - более подробное описание.

0 голосов
/ 07 апреля 2010

Вы ищете CTE .
Использование общих табличных выражений, MSDN .
Вам нужен как минимум SQL Server 2005.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...