FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

SQL - left join

SQL - left join 2006-08-21 18:47
Anonymer User
Hi,
ich habe gerade ein merkwürdiges Phänomen bei meiner mysql-Datenbank entdeckt und zwar wenn ich einen left join tätige, kommen im Ergebnis mehr Einträge heraus als sozusagen in der linken Tabelle vorhanden sind. Da beide Tabellen über 5000 Einträge haben ist es schwierig per Hand auf Anomalien in den Daten zu prüfen.

Kann es denn allein von der Theorie her sein das soetwas passiert? Ich dachte immer es tauchen im Ergebnis alle (und nur die) Einträge der linken Tabelle auf und die Daten der rechten Tabelle werden angehängt wo es möglich ist und sonst NULL-Werte.

Ich benutze eine 4.0.x-Version.

Schönen Dank!!

Re: SQL - left join 2006-08-21 19:10
leif
Ist die Spalte, mit der Du joinst, in der rechten Tabelle unique?

Re: SQL - left join 2006-08-21 19:35
Anonymer User
Ja ist sie.
Und wenn nicht wäre das wirklich relevant? Für mein Verständnis müßte er bei ner doppelten id den einen Eintrag wegschmeißen…

Re: SQL - left join 2006-08-21 20:33
leif
Das war einfach der erste Schnellschuß von mir. Ich bin mir nicht sicher, ob bei einem JOIN die Dubletten verworfen werden, kann mir ad hoc aber auch keine andere Möglichkeit vorstellen, wieso da sonst mehr Zeilen entstehen.

Re: SQL - left join 2006-08-21 23:35
tekai
Ja ist sie.
Und wenn nicht wäre das wirklich relevant? Für mein Verständnis müßte er bei ner doppelten id den einen Eintrag wegschmeißen…

klar ist das relevant. Sind die spalten über die du joinst in beiden tabellen unique? Wenn dem nicht so ist kannst du schon N-1 beziehungen haben und damit ergebnisse als einträge in der ersten/linken tabelle haben. LEFT JOIN bedeutet das min. die einträge aus der linke tabelle genommen werden und wenn sich in der rechten nichts passendes findet die spalten NULL haben. Über die art der "beziehung" d.h. 1-1 N-M etc sagt LEFT JOIN noch nichts aus.

Re: SQL - left join 2006-08-22 00:34
leif
OK, dann ist es doch so, wie ich zunächst vermutete und tekai bestätigt hat. Auch ein kleines Experiment stimmt dem zu:
mysql> select * from eins; +----+-------------+ | id | spalte_eins | +----+-------------+ | 1 | 10 | | 2 | 11 | +----+-------------+ mysql> select * from zwei; +----+-------------+ | id | spalte_zwei | +----+-------------+ | 1 | 10 | | 2 | 10 | +----+-------------+ mysql> select * from eins left join zwei on eins.spalte_eins = zwei.spalte_zwei; +----+-------------+------+-------------+ | id | spalte_eins | id | spalte_zwei | +----+-------------+------+-------------+ | 1 | 10 | 1 | 10 | | 1 | 10 | 2 | 10 | | 2 | 11 | NULL | NULL | +----+-------------+------+-------------+