Problem mit left join bzw. subselect bei Suche nach unterschiedlichen Datensätzen

Guten Morgen in die Runde,

ich habe hier ein Phänomen, dem ich bisher nicht auf die Schliche gekommen bin. Es geht letztendlich um die Überprüfung eines Datenimports in eine MySQL Datenbank. Um zu prüfen, ob vorangegangene Importe korrekt waren, importiere ich die Daten nochmals in eine andere Tabelle. Das Problem trat auf beim Vergleich der vorhandenen Tabelle mit der Kontrolltabelle.

Ein „SELECT count(*) FROM vorhanden / kontrolle WHERE lieferant = ‚dieser‘“ ergibt bei beiden Tabellen unterschiedliche Anzahl von Datensätzen (Es geht um ca. 1400 Unterschied bei ca. 1,3 Mio Datensätzen, also nichts was ein Mensch so lesen könnte).

Also war meine Überlegung, entweder enthält die eine Tabelle noch andere Datensätze, die in der anderen niocht vorhanden sind, oder es sind evtl. Datensätze doppelt vorhanden. Ein „SELECT … FROM vorhanden / kontrolle GROUP BY bestellnr HAVING count(*) > 1“ ergibt keine doppelten Datensätze.

Also versuche ich die fehlenden Datensätze durch ein LEFT JOIN zu finden:
„SELECT vorhanden.bestellnr FROM vorhanden
LEFT JOIN kontrolle ON vorhanden.bestellnr = kontrolle.bestellnr
WHERE kontrolle.bestellnr IS NULL“
ergibt keine Datensätze. Auch nicht umgekehrt. Nach den Join Abfragen gibt es keine unterschiedlichen Datensätze, Nach count() aber eine unterschiedliche Anzahl, was ja nicht zusammen passt.

Erst ein Subselect enthüllt die gesuchten Datensätze:
„SELECT bestellnr FROM vorhanden 
WHERE bestellnr NOT IN
(SELECT bestellnr FROM kontrolle)“.
Die Anzahl stimmt auch mit der Differenz zwischen den count() Ergebnissen überein.

Warum erhalte ich mit dem Subselect andere (korrekte) Ergebnisse, während ein LEFT JOIN keine Ergebnisse liefert ? Habe ich da etwas grundsätzlich falsch verstanden ?? Ich benutze MySQL 5.5.27 auf einem xampp (-Testsystem).

Danke im Voraus für alle hilfreichen Hinweise.

lo.

Moin, lo.,

Nach den Join
Abfragen gibt es keine unterschiedlichen Datensätze

ich ziehe da einen anderen Schluss: Es gibt keine Sätze, in denen Bestellnr NULL ist.

Gruß Ralf
i

Sorry, aber da hast du die Abfrage mit LEFT JOIN falsch verstanden. Die Bestellnr ist nur beim Left Join Null, wenn in der anderen Tabelle kein Datensatz passend vorhanden ist. Es gibt in keiner der beiden Tabellen einen Datensatz bei dem Bestellnr NULL ist.

Viele Grüße, Lo.

Moin, Lo,

Sorry, aber da hast du die Abfrage mit LEFT JOIN falsch
verstanden.

in der Tat, aber wie mir scheint, bin ich damit nicht allein :smile:

(Ich habe das LEFT überlesen.)

Eine der beiden Varianten des Left Join findet genau das, was die Subquery liefert. Falls nicht, ist der Join falsch formuliert.

Gruß Ralf