挑战链接位于此处。有一个包含两列的“树”表 - 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 (...)”条件上。任何人都可以确定为什么这不起作用吗?这对我来说似乎是非常基本的语法,我无法弄清楚为什么它不能正常工作。
叶节点子查询的测试用例输出:
我相信我已经解决了这个问题。由于某种原因,
"and id not in"
语句仅在以下子查询不包含空值时才有效。因此,原始查询的最后一部分包括一个排除空值的 where 条件:
and id not in
(
select distinct(p_id) from tree **where p_id is not null**
)