Реализация Multi-Tree в SQL Server аналогична той, которая существует в Oracle - PullRequest
0 голосов
/ 14 мая 2019

Начинающий программировать на MSSQL, меня попросили реализовать полную древовидную структуру, которая, очевидно, уже существует в Oracle.Не уверен, что делать.

Реализован простой пример набора данных, но нет уверенности в том, что еще нужно узлу для прохождения и вставки.

Create table HeirachTree(
    NodeID int not null primary key,
    NodeName nvarchar(100) not null,
    NodeParentID int,
    NodeNext int,
    )

  NodeStructure ([Node_ID], [Node_Name], [Node_Parent_ID], [Node_Next], Node_Depth)
  AS
  (
    SELECT [NodeID], [NodeName], [NodeParentID], [NodeNext], 0
    FROM [dbo].[HeirachTree]
    WHERE [NodeParentID] IS NULL    --Select all root nodes.
    UNION ALL                       
    SELECT t.[NodeID], t.[NodeName], t.[NodeParentID], t.[NodeNext], 
      s.Node_Depth + 1              
    FROM [dbo].[HeirachTree] t
      INNER JOIN NodeStructure s
        ON t.[NodeParentID] = s.[Node_ID]
  )
SELECT                              
  Node_Name, 
  Node_Depth,
  (SELECT [NodeNext] FROM [dbo].[HeirachTree]
    WHERE [NodeNext] = NodeStructure.[Node_ID]+1) AS NextNode,
  (SELECT [NodeName] FROM [dbo].[HeirachTree] 
    WHERE [NodeID] = NodeStructure.[Node_Parent_ID]) AS ParentNode
FROM  NodeStructure
ORDER BY Node_Depth, Node_Parent_ID 

Итак, нашел пример и рассчитал глубину, используя cte;для более простого запроса об использовании его в качестве ограничения.

Принял BFS и подумал, что мне тоже нужна ссылка на следующего ребенка.Так я могу сопоставить NextID с идентификатором, используя какой-то ключ или соединения или ...?Это даже необходимо?

Как я могу вставить определенный узел где-то в середине моего дерева?Что-то вроде использования Select более

CASE NextID WHEN NULL, затем NodeDepth + = 1 ELSE NodeDepth

Или ход мыслей в совершенно неверном направлении?

1 Ответ

0 голосов
/ 14 мая 2019

Для этого существует редко используемая концепция: HIERARCHYID.Этот тип данных знает о 10 собственных методах, таких как GetDescendant или GetReparentedValue

Этот пример взят из документации GetReparantedValue без изменений и, похоже, демонстрируетваши потребности.

DECLARE @SubjectEmployee hierarchyid , @OldParent hierarchyid, @NewParent hierarchyid  
SELECT @SubjectEmployee = OrgNode FROM HumanResources.EmployeeDemo  
  WHERE LoginID = 'adventure-works\gail0' ; -- Node /1/1/2/  
SELECT @OldParent = OrgNode FROM HumanResources.EmployeeDemo  
  WHERE LoginID = 'adventure-works\roberto0' ; -- Node /1/1/  
SELECT @NewParent = OrgNode FROM HumanResources.EmployeeDemo  
  WHERE LoginID = 'adventure-works\wanida0' ; -- Node /2/3/  

UPDATE HumanResources.EmployeeDemo  
SET OrgNode = @SubjectEmployee. GetReparentedValue(@OldParent, @NewParent)   
WHERE OrgNode = @SubjectEmployee ;  

SELECT OrgNode.ToString() AS Current_OrgNode_AS_Text,   
*  
FROM HumanResources.EmployeeDemo  
WHERE LoginID = 'adventure-works\gail0' ; -- Now node /2/3/2/  

Посмотрите на различные нативные методы ...

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