我正在编写一个查询,以便从节点的值排序的表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;
但是当我尝试使用" 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;
它没有像预期的那样工作。为什么这样?
答案 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,你会很开心。
干杯!