2017-03-16 12 views
0

ノードの値で順序付けられたテーブルBSTからノードタイプを見つけるためのクエリを作成しました。 テーブル、BSTは、2列NがBST内のノードの値を表し、Pは が言うNの親であるNとPを、持っていた、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

しかし、その代わりに以下に示すように私は、 "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

NOT INとNULLはあなたを驚かせるかもしれません! (そのため、代わりに「存在しない」ことをお勧めします。) – jarlh

+3

「期待どおりに動作しませんでした」 - 何を期待しましたか? –

+0

@a_horse_with_no_name "IN"と同じ出力を出すことを期待しました – PiyushM

答えて

0

@jarlhが示唆したように、EXISTS、またはIN NOTを使用する場合、のようなあなたのサブクエリからNULLを除外するようにしてくださいNOTを使用する:私があなただったら、私はEXISTSだけではないと思います

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 INを使用していました。後で私は、あなたが最初に考えなかったかなりの異なる要素を考慮する必要があることを認識しました。存在しない場所を使用すれば、あなたは幸せになれます。

乾杯!

+0

NOT INISの代わりにNOT EXISTSを使用する方法を教えてもらえますか? – PiyushM

関連する問題