-- 方案1:邻接表模型
CREATE TABLE TreeAdjacency (
NodeID INT PRIMARY KEY,
NodeName NVARCHAR(50) NOT NULL,
ParentID INT NULL,
FOREIGN KEY (ParentID) REFERENCES TreeAdjacency(NodeID)
);
-- 插入示例数据
INSERT INTO TreeAdjacency VALUES (1, '根节点', NULL);
INSERT INTO TreeAdjacency VALUES (2, '子节点1', 1);
INSERT INTO TreeAdjacency VALUES (3, '子节点2', 1);
INSERT INTO TreeAdjacency VALUES (4, '子节点1.1', 2);
-- 方案2:路径枚举模型
CREATE TABLE TreePath (
NodeID INT PRIMARY KEY,
NodeName NVARCHAR(50) NOT NULL,
Path NVARCHAR(MAX) NOT NULL -- 存储如'/1/2/4'这样的路径
);
-- 插入示例数据
INSERT INTO TreePath VALUES (1, '根节点', '/1');
INSERT INTO TreePath VALUES (2, '子节点1', '/1/2');
INSERT INTO TreePath VALUES (3, '子节点2', '/1/3');
INSERT INTO TreePath VALUES (4, '子节点1.1', '/1/2/4');
-- 查询所有子节点的递归CTE示例(邻接表)
WITH TreeCTE AS (
SELECT * FROM TreeAdjacency WHERE NodeID = 1 -- 从根节点开始
UNION ALL
SELECT t.* FROM TreeAdjacency t
JOIN TreeCTE c ON t.ParentID = c.NodeID
)
SELECT * FROM TreeCTE;