以下是hackerrank提出的问题: 编写查询以查找按节点值排序的BST节点类型。为每个节点输出以下内容之一:
Root:如果node是root节点。 Leaf:如果node是叶节点。 内部:如果节点既不是根节点也不是叶节点
表格如下:
N P
1 2
3 2
6 8
9 8
2 5
5 NULL
预期输出是:
1 Leaf
2 Inner
3 Leaf
5 Root
6 Leaf
8 Inner
9 Leaf
我用来解决这个问题的查询是:
SELECT N,
IF(P IS NULL,'Root',IF((SELECT COUNT(P)
FROM BST
WHERE P=B.N)>0,'Inner','Leaf'))
FROM BST AS B
ORDER BY N;
这给了我想要的输出但是如果我使用下面的查询它不会..
SELECT N,
IF(P IS NULL,'Root',IF((SELECT COUNT(P)
FROM BST
WHERE P=BST.N)>0,'Inner','Leaf'))
FROM BST
ORDER BY N;
有人可以解释一下它背后的原因,我所做的改变只是用表本身的名称替换别名,那么为什么它没有给出所需的输出?
答案 0 :(得分:1)
因为在第二种情况下,WHERE条件适用于内部BST表。
您也可以尝试此查询 -
SELECT
b1.N, IF(b1.P IS NULL, 'Root', IF(COUNT(b2.P) > 0,'Inner','Leaf'))
FROM BST b1
LEFT JOIN BST b2 ON b1.N = b2.P
GROUP BY b1.N