为什么以下查询在没有别名的情况下没有正确执行?

时间:2017-03-17 08:28:07

标签: mysql

以下是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;

有人可以解释一下它背后的原因,我所做的改变只是用表本身的名称替换别名,那么为什么它没有给出所需的输出?

1 个答案:

答案 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