Листовые узлы дерева SQL ОБНОВЛЕНИЕ - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь обновить таблицу, которая напоминает дерево. Я хочу обновить столбец, чтобы определить, является ли каждый узел листовым узлом. Таблица выглядит так:

#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.

Это утверждение, однако, не соответствует тому, что я думал. Любая помощь будет оценена.

Конечный результат должен выглядеть следующим образом:

NodeTable:

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

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы можете использовать EXISTS:

UPDATE n 
     SET n.IsLeaf = (CASE WHEN EXISTS (SELECT 1 FROM #NodeTable WHERE ParentID = n.NodeID) THEN 0 ELSE 1 END)
FROM #NodeTable n;
0 голосов
/ 28 июня 2018

Если вам просто нужно пометить листья, вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...