2017-03-17 26 views
1

下面是在hackerrank中提出的问题: 编写一个查询来查找按节点值排序的BST的节点类型。为每个节点输出以下内容之一:为什么下面的查询不能正确执行而没有别名?

根节点:如果节点是根节点。叶:如果节点是叶节点。 内:如果节点既不是根也不叶节点

表如下:

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; 

有人能解释我这背后的原因,把我所造的只是表本身的名称替换别名在这里的变化,那么它为什么不给所需的输出?

回答

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 
+0

可以请您详细阐述,因为我无法正确地理解这一部分,或者你能不能给我提供的链接从中我能学到更多一点吗? – deb

+0

@deb他意味着使用别名会触发相关子查询,因为它会提取外部表。 –

+0

明白:)感谢您的回复(y) – deb

相关问题