2017-03-16 151 views
0

我在写一个查询,找到该节点的值排序表BST节点类型不工作。 表,BST,有两列N和P,其中N表示在BST节点的值,P是N的父 说,BST具有以下记录: BST Table“NOT IN”预期

我成功执行该查询如下:

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

而不是用 “IN”,当我尝试使用 “NOT 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

不是和NULL的可能会让你大吃一惊! (这就是为什么我推荐'NOT EXISTS'的原因。) – jarlh

+3

“*它没有按预期工作。*” - 那么你期望什么? –

+0

@a_horse_with_no_name我期望它给出与使用“IN”相同的输出 – PiyushM

回答

0

由于@jarlh建议,使用NOT EXISTS,或使用NOT IN时,请务必从您的子查询中排除空值,如:

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

如果我是你,我只是一个NOT EXISTS。我曾经总是使用NOT IN作为初学者。后来我意识到你需要考虑一些你从来没有想到的不同因素。使用WHERE NOT EXISTS,你会成为快乐的家伙。

干杯!

+0

你能告诉我如何使用NOT EXISTS代替NOT IN – PiyushM