Заполнить столбец иерархии в существующей таблице родительско-дочерних отношений? - PullRequest
2 голосов
/ 11 марта 2011

Я ищу способ заполнения существующей таблицы parent-children:

Tabelle: Categories
-------------------
Columns: CategoryID
         ParentID

Я обновляю свой sql-сервер до 2008 R2.А теперь я добавил новый тип имя-иерархии для оптимизации производительности.

Так что я думаю написать sql-триггер, чтобы реорганизовать столбец иерархии, когда будет вызывать вставка / обновление ... но яЯ не специалист по SQL, поэтому я надеюсь, что кто-то может мне помочь.

Тестовый запрос: (мне нужно добавить строку при каждом рекурсивном вызове)

;WITH CTE (CategoryID, ParentID, HierarchyString) AS (
    SELECT CategoryID, ParentID, HierarchyString = CAST(ParentID AS VARCHAR(8000)) + '/' + CAST(CategoryID AS VARCHAR(8000))
    FROM Categories
    UNION ALL
    SELECT r.CategoryID, r.ParentID, HierarchyString = CAST(p.CategoryID AS VARCHAR(8000)) + '/' + CAST(r.ParentID AS VARCHAR(8000))
    FROM Categories r 
    INNER JOIN CTE p ON r.CategoryID = p.ParentID
)

SELECT * FROM CTE;

1 Ответ

2 голосов
/ 11 марта 2011

Я протестировал множество запросов, и теперь следующий запрос работает, но он определенно не очищен / не оптимизирован ... возможно, кто-то может улучшить запрос.

;WITH CTE (CategoryID, ParentID, Hierarchy) AS (
    SELECT CategoryID, ParentID, Hierarchy
    FROM Categories
    UNION ALL
    SELECT  p.CategoryID, r.ParentID, hierarchyid::Parse(REPLACE((r.Hierarchy.ToString() + p.Hierarchy.ToString()), '//', '/'))
    FROM Categories r
    INNER JOIN CTE p ON r.CategoryID = p.ParentID
)

SELECT CTE.CategoryID, R.ParentID, CTE.Hierarchy.ToString()
FROM CTE
INNER JOIN Categories AS R ON CTE.CategoryID = R.CategoryID
WHERE CTE.Hierarchy.ToString() LIKE '%/' + CAST(CTE.ParentID AS VARCHAR) + '/' + CAST(CTE.CategoryID AS VARCHAR) + '/%' OR CTE.ParentID = 0
...