LeetCode [树节点] - 我的 MS SQL 查询出了什么问题?

问题描述 投票:0回答:1

挑战链接位于此处。有一个包含两列的“树”表 - id 和 p_id,并且要求您将每个节点 id 分类为根、内部或叶。该树有一个根节点(p_id 又名父 id = null),内部节点是具有父节点和子节点的节点(因此它们的 p_id 不为 null,并且它们至少出现在 p_id 列中一次)。叶节点是 p_id 列中缺少的节点。

我的代码的工作原理是首先对根节点进行分类,然后对内部节点进行分类,最后对叶子进行分类。这些都是通过 UNION 连接的。对于特定的测试用例,我提交的内容是不正确的,因为叶子的三个子查询中的最后一个没有返回任何内容,因此我将这部分代码隔离在第二个 UNION 下面。完整代码如下。

select id, 'Root'
from tree
where p_id is null
UNION
select distinct p_id, 'Inner'
from  tree
where p_id is not null
and p_id not in
(
    select id from tree where p_id is null
)
UNION
select id, 'Leaf'
from tree
where p_id is not null
and id not in
(
    select distinct(p_id) from tree
)

带有输出和预期输出的测试用例如下。回想一下,这是上面代码底部三分之一的输出(从第二个 UNION 语句下面的“select id, 'Leaf'”开始)。输出不返回任何内容,而它应该返回所有叶节点。

当我删除最后一个条件“

and id not in (select distinct(p_id) from tree)
”(仅留下
select id from tree where p_id is not null
)时,它会正确返回所有内部节点和叶节点,因此问题出在“and id not in (...)”条件上。任何人都可以确定为什么这不起作用吗?这对我来说似乎是非常基本的语法,我无法弄清楚为什么它不能正常工作。

叶节点子查询的测试用例输出:

sql-server tree
1个回答
0
投票

我相信我已经解决了这个问题。由于某种原因,

"and id not in"
语句仅在以下子查询不包含空值时才有效。因此,原始查询的最后一部分包括一个排除空值的 where 条件:

and id not in
(
    select distinct(p_id) from tree **where p_id is not null**
)
© www.soinside.com 2019 - 2024. All rights reserved.