Oracle 10g select in / not in

FrankBooth

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein Problem mit einem SQL Statement

SQL:
SELECT  a.ID
FROM Tabelle1 a
WHERE  a.ID NOT IN (SELECT ID FROM Tabelle2)


SQL:
SELECT  a.ID
FROM Tabelle1 a
WHERE  a.ID IN (SELECT ID FROM Tabelle2)

Beide leifern mir eine leere Menge. Tabelle 1 und Tabelle 2 sind nicht leer!

Ich dachte immer entwede ist eine ID in einer Tabelle oder nicht und nicht beides.
Ich steh auf dem Schlauch. Ist was an dem NOT IN() falsch?

Danke im Voraus!
Grüße
 
Zuletzt bearbeitet von einem Moderator:
Hi

WEnn die Ergebnismenge so sind, dass sie sich aufheben, wird auch nichts ausgegeben.

Ich geh mal davon aus, dass du irgendwo eine falsche Spalte angegeben hast und dadurch kein Ergebnis zu stande kommt. Ohne hier aber die Tabellenstruktur und ggf. auch den Inhalt zu kennen ist das schwierig
 
Hallo,

wahrscheinlich ist hier Oracles pedantische Behandlung von NULL-Werten im Spiel: NULL ist nicht gleich NULL aber auch nicht ungleich NULL. Aber, bevor es allzu philosophisch klingt, ein praktisches Beispiel. Ich erzeuge zwei harmlose Tabellen mit disjunkten Inhalten:

Code:
select * 
  from tabelle1;

   ID
-----
    1
    2
    3
    4
    5

select * 
  from tabelle2;

   ID
-----
    6
    7
Die IN-Operation sollte in diesem Fall kein Ergebnis liefern, die NOT IN-Variante hingegen alle Sätze der Tabelle1 - und so ist das dann auch:
Code:
SQL> SELECT  a.ID
  2  FROM Tabelle1 a
  3  WHERE  a.ID IN (SELECT ID FROM Tabelle2);

Es wurden keine Zeilen ausgewählt

SQL> SELECT  a.ID
  2  FROM Tabelle1 a
  3  WHERE  a.ID NOT IN (SELECT ID FROM Tabelle2);

        ID
----------
         5
         4
         3
         1
         2
Jetzt ergänze ich in Tabelle2 einen NULL-Wert:
Code:
SQL> insert into Tabelle2 values (NULL);

1 Zeile wurde erstellt.
Und setze dann wieder die beiden Test-Abfragen ab:
Code:
SQL> SELECT  a.ID
  2  FROM Tabelle1 a
  3  WHERE  a.ID IN (SELECT ID FROM Tabelle2);

Es wurden keine Zeilen ausgewählt

SQL> SELECT  a.ID
  2  FROM Tabelle1 a
  3  WHERE  a.ID NOT IN (SELECT ID FROM Tabelle2);

Es wurden keine Zeilen ausgewählt
Da Tabelle2 jetzt den NULL-Wert enthält, bringt der logische Operator NOT IN jetzt nicht mehr TRUE, sondern NULL (also "weiß nicht"). Das ist auch der Grund dafür, dass NOT IN und NOT EXISTS nicht äquivalent sind, wie Tom Kyte immer mal wieder erklärt: http://asktom.oracle.com/pls/asktom/f?p=100:11:3372168492847872::::P11_QUESTION_ID:442029737684.

Durchgespielt habe ich den Fall übrigens nicht nur, um zu prüfen, ob meine Erinnerung in diesem Fall stimmt, sondern auch, weil ich mir nicht völlig sicher war, ob nicht auch ein Problem mit Korrelationseffekten vorliegen könnte, da zwar in der äußeren Query mit einem Alias gearbeitet wird, aber nicht in der inneren - und in solchen Fällen manchmal Seltsames passiert; aber hier scheint sich eher Oracles idiosynkratischer Umgang mit NULL-Werten auszuwirken (den ich übrigens ganz angemessen finde, da NULL nun mal ein Sonderfall ist und auch so behandelt werden sollte)

Gruß

MP
 
Zurück