Wenn’s hakt: Der Klassiker unter den Fehlern

Falsche Datenbankverknüpfungen? Ein Dauerbrenner.

Du fragst Dich, warum plötzlich Zahlen nicht stimmen, Datensätze verschwinden oder Berichte komische Werte zeigen?

In 90 % der Fälle liegt’s an der Verknüpfung. Meist simpel. Manchmal fies. Und oft schwer zu finden.

Typische Symptome

  • „Warum sehe ich weniger Datensätze als erwartet?“
  • „Warum sind plötzlich Dubletten da?“
  • „Warum stimmt die Summe nicht mehr?“
  • „Warum läuft der Bericht auf einmal ewig?“

Die Antwort: Schlechte Joins. Meist INNER JOIN, obwohl OUTER JOIN nötig wäre. Oder JOIN ohne passende Indexe. Oder JOIN auf Felder mit Leerzeichen und Null-Werten. Klassiker.

Ein einfaches Beispiel: INNER JOIN killt Daten

SELECT Kunden.KundenID, Bestellungen.BestellNr
FROM Kunden
INNER JOIN Bestellungen ON Kunden.KundenID = Bestellungen.KundenID;

Das klappt – solange jede Bestellung auch wirklich einen passenden Kunden hat. Wenn nicht? Bestellung futsch im Ergebnis. INNER JOIN filtert gnadenlos.

Besser mit LEFT JOIN – wenn Du nichts verlieren willst

SELECT Kunden.KundenID, Bestellungen.BestellNr
FROM Kunden
LEFT JOIN Bestellungen ON Kunden.KundenID = Bestellungen.KundenID;

Jetzt siehst Du auch Kunden ohne Bestellungen. Kann sinnvoll sein – oder auch nicht. Kommt auf die Fragestellung an.

Nulls und Leerzeichen: Die unsichtbaren Feinde

' Beispiel für fiese Falle bei Textverknüpfungen
SELECT a.ArtikelNr, b.Bestand
FROM Artikel a
LEFT JOIN Lager b ON a.ArtikelNr = b.ArtikelNr;

Klingt harmlos. Ist es nicht.

Wenn a.ArtikelNr ein Leerzeichen hat (z. B. „A123 „) und b.ArtikelNr nicht („A123“), ist das für Access ein anderes Ding. Kein Join. Kein Treffer. Keine Daten.

Ich trimme IMMER vor dem JOIN:

SELECT a.ArtikelNr, b.Bestand
FROM (SELECT ArtikelNr FROM Artikel) AS a
LEFT JOIN (SELECT ArtikelNr, Bestand FROM Lager) AS b
ON Trim(a.ArtikelNr) = Trim(b.ArtikelNr);

Oder gleich auf Datenbank-Ebene sauber halten: Beim Import/Export alles trimmen.

Falscher Datentyp = falsche Verknüpfung

Zahl auf Text verknüpft? Geht. Aber schief.

' ArtikelNr ist Zahl, aber wird mit Text verknüpft
SELECT *
FROM Tabelle1
INNER JOIN Tabelle2 ON Tabelle1.ArtikelNr = Tabelle2.ArtikelCode;

Wenn ArtikelCode „00123“ ist und ArtikelNr die Zahl 123 – kein Match.

Lösung: Einheitliche Datentypen. Oder zwingen:

ON CStr(Tabelle1.ArtikelNr) = Tabelle2.ArtikelCode

Aber Achtung: Performance-Killer. Besser sauber modellieren.

Performance-Probleme durch schlechte JOINs

Wenn Deine Abfrage ewig läuft – prüf die Verknüpfung.

  • Werden Indexe genutzt?
  • JOIN auf berechneten Feldern?
  • Gibt’s unnötige Unterabfragen?

Tipp: Abfrage in mehrere Stufen zerlegen.

' Erst mal saubere Basisabfrage
SELECT ArtikelNr, Bestand
INTO tmp_Lager
FROM Lager
WHERE Standort = 'Zentral';

' Dann joinen
SELECT a.ArtikelNr, l.Bestand
FROM Artikel a
LEFT JOIN tmp_Lager l ON a.ArtikelNr = l.ArtikelNr;

Access liebt Zwischentabellen. Gerade bei komplexen Joins.

Meine Checkliste bei fehlerhaften Verknüpfungen

  • Sind die Feldnamen wirklich gleich?
  • Sind die Datentypen kompatibel?
  • Gibt es Leerzeichen oder führende Nullen?
  • Ist INNER JOIN wirklich sinnvoll?
  • Nutze ich berechnete Felder im JOIN?
  • Haben die Spalten Indexe?

Debug-Trick: JOINs visuell testen

Ich baue mir kleine Testabfragen mit bewusst fehlerhaften Daten.

' Beispiel-Testdaten mit absichtlichen Fehlern
SELECT * FROM Artikel WHERE ArtikelNr Like '* ';
SELECT * FROM Lager WHERE ArtikelNr Is Null;

So finde ich Ausreißer. Und kann gezielt nachbessern.

Also

Falsche Verknüpfungen sind wie nasse Socken: nervig, aber oft vermeidbar.
Wenn Du’s sauber aufziehst, läuft’s auch im Access.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert