2017-03-16 150 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