2

以下のような二分木を格納するテーブルを作成しました。

- NodeID
- NodeLeft
- NodeRight

NodeLeft には、左側のノードの ID が格納されます。Node right には、右ノードの ID が格納されます。

NodeID を渡すと、左側の子ノードの数と右側の子ノードの数をカウントするプロシージャを作成する必要があります。2つの手順に分離できます。

4

2 に答える 2

4

これを試して:

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 Fiddleがあります。レベルは、それがどのように機能しているかを確認するためのものです。後で使えるようになりますように。

于 2012-09-02T10:52:47.950 に答える
0

このトピックを見つけました。 http://www.sqlservercentral.com/Forums/Topic1152543-392-1.aspx

テーブルの構造は、私の設計したテーブルとは異なります。しかし、それは二分木なので、私はそれを使うことができます。

そして、SQLフィドルは非常に役立ちます。

于 2012-09-02T15:25:45.500 に答える