以下のような二分木を格納するテーブルを作成しました。
- NodeID
- NodeLeft
- NodeRight
NodeLeft には、左側のノードの ID が格納されます。Node right には、右ノードの ID が格納されます。
NodeID を渡すと、左側の子ノードの数と右側の子ノードの数をカウントするプロシージャを作成する必要があります。2つの手順に分離できます。
以下のような二分木を格納するテーブルを作成しました。
- NodeID
- NodeLeft
- NodeRight
NodeLeft には、左側のノードの ID が格納されます。Node right には、右ノードの ID が格納されます。
NodeID を渡すと、左側の子ノードの数と右側の子ノードの数をカウントするプロシージャを作成する必要があります。2つの手順に分離できます。
これを試して:
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があります。レベルは、それがどのように機能しているかを確認するためのものです。後で使えるようになりますように。
このトピックを見つけました。 http://www.sqlservercentral.com/Forums/Topic1152543-392-1.aspx
テーブルの構造は、私の設計したテーブルとは異なります。しかし、それは二分木なので、私はそれを使うことができます。
そして、SQLフィドルは非常に役立ちます。