"不在"没有按预期工作

时间:2017-03-16 14:35:03

标签: sql oracle

我正在编写一个查询,以便从节点的值排序的表BST中查找节点类型。 表BST有两列N和P,其中N表示BST中节点的值,P是N的父节点。 比方说,BST有以下记录:   BST Table

我按如下方式成功执行了查询:

SELECT n,CASE
                WHEN p IS NULL THEN 'Root'
                WHEN n IN (SELECT DISTINCT p FROM BST) THEN 'Inner'
                ELSE 'Leaf'
             END
FROM BST
ORDER BY n;

结果:Result as expected

但是当我尝试使用" NOT IN"而不是使用" IN"如下所示:

SELECT n,CASE
            WHEN p IS NULL THEN 'Root'
            WHEN n NOT IN (SELECT DISTINCT p FROM BST) THEN 'Leaf'
            ELSE 'Inner'
         END
FROM BST
ORDER BY n;
它没有像预期的那样工作。为什么这样?

2 个答案:

答案 0 :(得分:0)

正如@jarlh建议的那样,使用NOT EXISTS,或者当使用NOT IN时,请确保从子查询中排除NULL,如:

SELECT n,CASE
            WHEN p IS NULL THEN 'Root'
            WHEN n NOT IN (SELECT DISTINCT p FROM BST WHERE p IS NOT NULL) THEN 'Leaf'
            ELSE 'Inner'
         END
FROM BST
ORDER BY n;

答案 1 :(得分:0)

如果我是你,我只是不存在。我以前总是使用NOT IN作为初学者。后来我意识到你需要考虑一些你从未想过的不同因素。使用WHERE NOT EXISTS,你会很开心。

干杯!