我创建了一个 BST 表,其中有两列 Node 和 Parent 作为整数数据类型。我在这个表中插入一些值,我想检测叶节点、内部节点和根节点。
代码:
CREATE TABLE BST
(
Node int,
Parent int
);
INSERT INTO BST (Node, Parent) VALUES (1, 2);
INSERT INTO BST (Node, Parent) VALUES (3, 2);
INSERT INTO BST (Node, Parent) VALUES (6, 8);
INSERT INTO BST (Node, Parent) VALUES (9, 8);
INSERT INTO BST (Node, Parent) VALUES (2, 5);
INSERT INTO BST (Node, Parent) VALUES (8, 5);
INSERT INTO BST (Node) VALUES (5);
我写了这个查询:
SELECT
Node,
CASE
WHEN Parent IS NULL THEN 'Root'
WHEN Node_ IS NOT NULL AND Parent IS NOT NULL
AND (SELECT Node_ FROM BST) NOT IN (SELECT Parent FROM BST)
THEN ('Leaf')
WHEN Node IS NOT NULL AND Parent IS NOT NULL
AND (SELECT Parent FROM BST) NOT IN (SELECT Node FROM BST)
THEN ('Inner')
END
FROM
BST;
我期待得到这样的结果:
1 Leaf
2 Inner
3 Leaf
5 Root
6 Leaf
8 Inner
9 Leaf
但我收到此错误:
子查询返回超过 1 个值。当子查询跟在 =、!=、<, <= , >、>= 后面或子查询用作表达式时,这是不允许的。
有人对这个问题有任何想法吗?这是语法错误还是逻辑错误?或者我的算法不正确...
我假设您正在寻找 sql server 中的递归 CTE?您的查询不起作用,因为您无法在子查询中调用查询本身。我在这里只是添加一个粗略的想法,如果你想了解更多关于Recursive CTE,请查看msdn https://learn.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver16
WITH Root AS (
SELECT
Node,
1 AS level
FROM BST
WHERE parent IS NULL
UNION ALL
SELECT
b.parent,
level + 1
FROM BST b
INNER JOIN Root r
ON b.Parent = r.Node
)
SELECT *
FROM Root;