2017-03-16 4 views
0

Ich schrieb eine Abfrage, um den Knotentyp aus der Tabelle BST zu finden, geordnet nach dem Wert des Knotens. Tisch, BST, hatte zwei Spalten N und P, wobei N den Wert eines Knotens in BST darstellt, und P ist die Mutter von N. sagen, BST hat folgende Einträge: BST Table"NICHT IN" funktioniert nicht wie erwartet

ich erfolgreich ausgeführt die Abfrage wie folgt:

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; 

Ergebnis: Result as expected

Aber statt mit "IN", wenn ich die gleiche Abfrage mit "NOT IN" versuchte, wie unten angegeben:

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; 

es hat nicht wie erwartet funktioniert. Warum?

+2

NICHT IN und NULL können Sie überraschen! (Deshalb empfehle ich stattdessen "NOT EXISTS".) – jarlh

+3

"* es hat nicht wie erwartet funktioniert. *" - was hast du erwartet? –

+0

@a_horse_with_no_name Ich erwartete, dass es dieselbe Ausgabe liefert wie mit "IN" – PiyushM

Antwort

0

Als @jarlh vorgeschlagen, verwenden Sie NICHT VORHANDEN, oder, wenn sie nicht verwenden, müssen Sie NULL-Werte aus dem Unterabfrage wie auszuschließen:

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

Wenn ich Sie wäre, würde ich nur NICHT VORHANDEN. Ich benutze immer NOT IN als Anfänger. Später wurde mir klar, dass man einige Faktoren berücksichtigen muss, an die man anfangs nicht gedacht hat. Verwenden Sie WHERE NOT EXISTS und Sie werden glücklich sein.

Prost!

+0

Können Sie zeigen, wie ich NOT EXISTS anstelle von NOT IN verwenden kann? – PiyushM

Verwandte Themen