sql - 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
解决方案
如果您只需要标记叶子,则可以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
推荐阅读
- android - firebase 身份验证 sendVerificationEmail() 任务需要永远
- javascript - Codemirror 自动完成功能不适用于 javascript
- reactjs - pusher .bind 方法中的过时反应状态
- html - 如何使用引导程序中的列构建以下设计?
- django - 我如何过滤字段 django jsonfield 是日期时间?
- c++ - Qt subdirs:使用通用源文件
- c# - 将数据插入(第 30 列,第 1 行)
- couchdb - couchdb _find 安全,过滤 _find 返回结果
- javascript - JS - 如何根据从其他 textarea 输入镜像的输入文本自动调整 textarea 的大小?
- r - R:在 R 中循环和可视化“运行时间”