首页 > 解决方案 > SQL树叶节点更新

问题描述

我正在尝试更新一个类似于树的表。我想更新一列以确定每个节点是否是叶节点。该表如下所示:

#NodeTable:
NodeID | ParentID | IsLeaf
--------------------------
0      | NULL     | 0 
1      | 0        | 0
3      | 1        | 0
5      | 3        | 0
6      | 3        | 0
7      | 1        | 0

我尝试使用以下命令更新表:

UPDATE #NodeTable
SET IsLeaf = 
    CASE
        WHEN NodeID IN (SELECT ParentID FROM #NodeTable) THEN 0 ELSE 1
    END

逻辑是,如果 NodeID 出现在 (SELECT ParentID..) 中,则它不是叶节点,因此 IsLeaf 应该为 0,否则如果它不存在,则它是叶,IsLeaf 应该为 1。

然而,这个声明并没有像我想象的那样做。任何帮助,将不胜感激。

最终结果应如下所示:

节点表:

NodeID | ParentID | IsLeaf
--------------------------
0      | NULL     | 0 
1      | 0        | 0
3      | 1        | 0
5      | 3        | 1
6      | 3        | 1
7      | 1        | 1

标签: sqlazure-sql-database

解决方案


如果您只需要标记叶子,则可以NOT EXISTS对所有父母使用。

IF OBJECT_ID('tempdb..#NodeTable') IS NOT NULL
    DROP TABLE #NodeTable

CREATE TABLE #NodeTable (
    NodeID INT,
    ParentID INT,
    IsLeaf BIT DEFAULT 0)

INSERT INTO #NodeTable (
    NodeID,
    ParentID)
VALUES
    (0, NULL),
    (1, 0),
    (3, 1),
    (5, 3),
    (6, 3),
    (7, 1)

UPDATE L SET
    IsLeaf = 1
FROM
    #NodeTable AS L
WHERE
    NOT EXISTS (SELECT 'does not have any children' FROM #NodeTable AS P WHERE L.NodeID = P.ParentID)


SELECT * FROM #NodeTable AS T ORDER BY T.NodeID

推荐阅读