Integritätsbruch finden in MySQL Version < 4.x
Thomas Schmieder
- datenbank
Hallo SQL-Spezialisten,
ich habe da ein Problem, dass ich nicht gelöst bekomme. Meine MySQL-Version 3.23.37-log kann noch keine geschachtelten Select-Anweisungen.
Wie kann ich trotzdem ausschließlich durch SQL-Abfrage Integritätsbrüche herausfinden?
Beispiel:
T_Kunde T_RECH
--------- ------------
ID ID
ID_KUNDE
In Kunde sind nun nur die Datensätze
ID
-----
1
2
3
4
Und in Rechnung
ID ID_KUNDE
-----------------
1 5
2 1
3 1
4 2
5 6
6 3
7 4
enthalten. Das bedeutet, dass Rechnung Nr. 1 und Nr. 5 keine Entsprechnung mehr in T_KUNDE haben. Wie kann ich abfragen, welche Datensätze in T_RECH _keinen_ Partner mehr in T_KUNDE finden?
Grüße
Tom
Hi Tom
Wie kann ich trotzdem ausschließlich durch SQL-Abfrage Integritätsbrüche herausfinden?
Achtung ungetestet:
Über einen Left outer join, da wo die rechte Seite null ist, fehlen
die entsprechenden Partner. Wenn ein Partner existiert, kriegst du
keine Zeile mit NULL auf der rechten Seite zurück.
Mit rechte Seite meine ich, ein Feld aus der rechten Seite des Joins
was als NOT NULL definiert ist, also keine NULLs von den Daten her
zurückbringen kann.
Gruss Daniela
Hallo Daniela,
freu mich, was von Dir zu lesen.
Über einen Left outer join, da wo die rechte Seite null ist, fehlen
die entsprechenden Partner. Wenn ein Partner existiert, kriegst du
keine Zeile mit NULL auf der rechten Seite zurück.
Da setzt jetzt das Gerübel ein, wie sowas aussieht. Was "linke" und was "rechte" Tabelle sind bekomm ich dank "Robin-Hood-Regel" noch hin. Die linke hat das Sagen und die rechte geht vor dem Pfeil...
Aber wie ich das in einen "left outer join" zwinge, dafür reichts im Moment noch nicht.
Ich blätter dann mal meine ganzen Bücher durch.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo nochmal,
Aber wie ich das in einen "left outer join" zwinge, dafür reichts im Moment noch nicht.
Blättern hat sich gelohnt:
select T_PERSON.* from T_PERSON
left join T_NACHNAME on T_PERSON.ID_NACHNAME=T_NACHNAME.ID
where T_NACHNAME.ID is NULL;
So kann man alle Datensätze in der Tabelle T_PERSON finden, die keinen Partner in T_NACHNAME haben. Dank Deines Tipps (Daniela) mit Google unter http://www.little-idiot.de/mysql/mysql-118.html gefunden. Nun muss ich nur noch ein bisschen übern, damit ich die Syntax bzw. Semantik nirhc nur verstehe, sondern aus dem Kopf reproduzieren kann. Naja, das lohnt sich aber!
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi Thomas,
Wie kann ich trotzdem ausschließlich durch SQL-Abfrage Integritätsbrüche herausfinden?
willst Du sie wirklich nur finden - nicht auch verhindern, daß überhaupt welche auftreten?
(Stichwort: Constraints)
Viele Grüße
Michael
Hi Michael,
Wie kann ich trotzdem ausschließlich durch SQL-Abfrage Integritätsbrüche herausfinden?
willst Du sie wirklich nur finden - nicht auch verhindern, daß überhaupt welche auftreten?
(Stichwort: Constraints)
Das wäre dann der nächste Schritt. Aber noch ist unsere Vorgangsbearbeitung nicht wasserdicht und da kann es schon passieren, dass sich jemand mitten in einem verketteten Vorgang einfach abseilt (den Browser schließt) und wir es nicht merken. Transaktiontracking fehlt eben noch.
Liebe Grüße aus http://www.braunschweig.de
Tom