二叉树中的T-SQL计数子节点?

二叉树中的T-SQL计数子节点?,sql,tsql,binary-tree,Sql,Tsql,Binary Tree,我制作了一个表来存储二叉树,如下所示: - NodeID - NodeLeft - NodeRight NodeLeft存储左侧节点的ID。和Node right存储右节点的ID 我需要编写一个过程,如果我传递一个NodeID,它将计算左侧有多少子节点,右侧有多少子节点。可以分成两个步骤。尝试以下操作: WITH CTE_Node( NodeID, NodeRigth, NodeLeft, Level, RigthOrLeft ) AS ( SELECT NodeI

我制作了一个表来存储二叉树,如下所示:

- NodeID
- NodeLeft
- NodeRight
NodeLeft存储左侧节点的ID。和Node right存储右节点的ID

我需要编写一个过程,如果我传递一个NodeID,它将计算左侧有多少子节点,右侧有多少子节点。可以分成两个步骤。

尝试以下操作:

WITH CTE_Node(
  NodeID,
  NodeRigth,
  NodeLeft,
  Level,
  RigthOrLeft
  )
AS
(
SELECT 
 NodeID,
  NodeRigth,
  NodeLeft,
  0 AS Level,
  'P'
  FROM Node
  WHERE NodeID = 1

  UNION ALL

  SELECT 
 Node.NodeID,
  Node.NodeRigth,
  Node.NodeLeft,
  Level + 1,
  CASE WHEN CTE_Node.NodeLeft = Node.NodeID THEN 'R' ELSE 'L' END
  FROM Node
INNER JOIN CTE_Node ON CTE_Node.NodeLeft = Node.NodeID
  OR CTE_Node.NodeRigth = Node.NodeID
  )
SELECT DISTINCT RigthOrLeft, 
COUNT(NodeID) OVER(PARTITION BY RigthOrLeft)  
FROM CTE_Node
这是一个例子。 这个级别只是为了看看它是如何工作的。您可以稍后使用。

试试这个:

WITH CTE_Node(
  NodeID,
  NodeRigth,
  NodeLeft,
  Level,
  RigthOrLeft
  )
AS
(
SELECT 
 NodeID,
  NodeRigth,
  NodeLeft,
  0 AS Level,
  'P'
  FROM Node
  WHERE NodeID = 1

  UNION ALL

  SELECT 
 Node.NodeID,
  Node.NodeRigth,
  Node.NodeLeft,
  Level + 1,
  CASE WHEN CTE_Node.NodeLeft = Node.NodeID THEN 'R' ELSE 'L' END
  FROM Node
INNER JOIN CTE_Node ON CTE_Node.NodeLeft = Node.NodeID
  OR CTE_Node.NodeRigth = Node.NodeID
  )
SELECT DISTINCT RigthOrLeft, 
COUNT(NodeID) OVER(PARTITION BY RigthOrLeft)  
FROM CTE_Node
这是一个例子。 这个级别只是为了看看它是如何工作的。请您稍后使用。

我找到了这个主题。

桌子的结构与我设计的桌子不同。但它是一个二叉树,所以我可以使用它

SQL FIDLE非常有用。

我找到了这个主题。

桌子的结构与我设计的桌子不同。但它是一个二叉树,所以我可以使用它


SQL FIDLE非常有用。

您应该研究递归公共表表达式。您应该研究递归公共表表达式。谢谢您的帮助。但是当我在表中添加更多节点时,结果总是一样的。谢谢你的帮助。但当我向表中添加更多节点时,结果总是相同的。