Оператор INSERT для замыкающей таблицы, включающий столбец уровня/расстояния

Я ссылаюсь на презентацию Билла Карвина, чтобы реализовать закрывающую таблицу, которая поможет мне управлять иерархиями. К сожалению, в презентации не показано, как можно вставить/обновить столбец Level, упомянутый на слайде 67; это было бы очень полезно. Я думал об этом, но я не мог придумать что-то конкретное, что я мог бы проверить. Вот что я получил до сих пор:

create procedure USP_OrganizationUnitHierarchy_AddChild 
    @ParentId UNIQUEIDENTIFIER,
    @NewChildId UNIQUEIDENTIFIER
AS
BEGIN
    INSERT INTO [OrganizationUnitHierarchy]
    (
        [AncestorId],
        [DescendantId],
        [Level]
    )
    SELECT [AncestorId], @NewChildId, (here I need to get the count of ancestors that lead to the currently being selected ancestor through-out the tree)
    FROM [OrganizationUnitHierarchy]
    WHERE [DescendantId] = @ParentId
    UNION ALL SELECT @NewChildId, @NewChildId
END
go 

Я не уверен, как я мог это сделать. Любые идеи?


person Kassem    schedule 04.09.2013    source источник


Ответы (1)


Вы знаете, что для Parent = self у вас есть уровень = 0, и когда вы копируете пути от предка, вы просто увеличиваете уровень на 1:

create procedure USP_OrganizationUnitHierarchy_AddChild 
    @ParentId UNIQUEIDENTIFIER,
    @NewChildId UNIQUEIDENTIFIER
AS
BEGIN
    INSERT INTO [OrganizationUnitHierarchy]
    (
        [AncestorId],
        [DescendantId],
        [Level]
    )
    SELECT [AncestorId], @NewChildId, [Level] + 1
    FROM [OrganizationUnitHierarchy]
    WHERE [DescendantId] = @ParentId
    UNION ALL
    SELECT @NewChildId, @NewChildId, 0
END
person Roman Pekar    schedule 04.09.2013
comment
Серьезно?! Это так просто? Я чувствую себя таким глупым прямо сейчас ... Спасибо за помощь, очень признателен :) - person Kassem; 05.09.2013
comment
Я использую эту модель для деревьев на работе, поэтому она мне знакома, иногда простые вещи поначалу трудно понять. - person Roman Pekar; 05.09.2013