рассчитать количество левого и правого детей в двоичном дереве в SQL Server 2008 R2 - PullRequest
0 голосов
/ 18 октября 2011

У меня есть двоичное дерево, реализованное в sql server 2008 r2 в следующем виде

Двоичная информация таблицы

Идентификатор родителя ---- LeftChildID ----RightChildID

1 -------------- 2 -------------- 3

2 -------------- 4 --------------- 5

3 -------------- 6---------------- 7

      1(Root)    
  2   |    3     
4   5 |  6   7

и так далее.Теперь мне нужно подсчитать общее количество членов на левой и правой стороне члена, например, 1 имеет 3 левых детей и 3 правых ребенка.2 имеет 1 левого ребенка и 1 правого ребенка.

Я, вероятно, могу сделать это в C #, но есть ли способ сделать это на сервере SQL с использованием Procs или функций?

Я не могу использовать heirarchyid, потому чтоданные уже занесены в эту таблицу.

PS счет нужно брать отдельно, т. е. общее количество левых детей и общее количество правых детей.

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Вы можете создать рекурсивную процедуру, подобную этой:

CREATE PROCEDURE BinaryTreeCount
    @ParentId int,
    @HowMany int OUTPUT
as
BEGIN
    DECLARE @childenCount int
    SET @childenCount = 0
    SET @HowMany = 0

    SET @LeftChildId = null
    SET @RightChildId = null

    SELECT @LeftChildId = LeftChildID
         , @RightChildId = RightChildID
      FROM yourTableName
     WHERE ParendId = @ParentId

    if (@LeftChildId is not null) begin
        @howMany = @howMany + 1
        exec BinaryTreeCount @ParentId = @LeftChildId
                           , @HowMany  = @childenCount OUTPUT
        @howMany = @howMany + @childenCount
    end 

    if (@RightChildId is not null) begin
        @howMany = @howMany + 1
        exec BinaryTreeCount @ParentId = @RightChildId
                           , @HowMany  = @childenCount OUTPUT
        @howMany = @howMany + @childenCount
    end 
END

Это просто идея, я ее не проверял.

1 голос
/ 18 октября 2011

Поскольку вы работаете с SQL 2008, я вполне уверен, что вы можете сделать это с помощью Recursive CTE (Common Table Expression): http://msdn.microsoft.com/en-us/library/ms186243.aspx

Без копии SQL передо мной я быбоюсь показать код, я боюсь.

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