SQL - JOIN zeigt mehrfaches an
Guten Morgen,
ich habe mich frisch mit dem Thema SQL "angefreundet".
Jetzt habe ich aber irgendwie ein Problem. Und ich hoffe, dass ihr mir helfen könnt.
Folgendes Statment habe ich:
Jetzt zeigt er mir die Nummer 0815 min. 2x an. Woran kann das liegen? Ich hoffe, dass ihr mit den paar Infos zurecht kommt.
Ich bin für jeden Tipp dankbar.
Michael
ich habe mich frisch mit dem Thema SQL "angefreundet".
Jetzt habe ich aber irgendwie ein Problem. Und ich hoffe, dass ihr mir helfen könnt.
Folgendes Statment habe ich:
select
x.nummer,
x.datum1,
y.datum2
from rechnung as x
join auftrag as y
on x.datum1 = y.datum2
where x.nummer like '0815'
Jetzt zeigt er mir die Nummer 0815 min. 2x an. Woran kann das liegen? Ich hoffe, dass ihr mit den paar Infos zurecht kommt.
Ich bin für jeden Tipp dankbar.
Michael
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 288570
Url: https://administrator.de/forum/sql-join-zeigt-mehrfaches-an-288570.html
Ausgedruckt am: 02.04.2025 um 03:04 Uhr
9 Kommentare
Neuester Kommentar
Der Join in dieser Form ist aus mehren Gründen Blödsinn oder zumindest nicht gut aufgebaut:
1) Wenn du als Join-Condition x.datum1 = y.datum2 nimmst, sind diese immer gleich. Du gibst beide im Select-Teil aus, das ist nicht annährend sinnvoll.
2) Dein Join ist nicht explizit benannt. Es wird ein INNER JOIN ausgeführt und ich finde der Klarheit wegen sollte man diesen auch so bennen.
3) Über denn Sinn oder Unsinn, die Inhalte so zu verknüpfen, kann man nur wenige Aussagen treffen ohne den Inhalt und Aufbau der Tabellen zu kennen. Wenn du unerwarteter Weise mehr als eine Zeile pro Eintrag in Tabelle rechnungen zurück bekommst liegt das definitiv daran das in Tabelle auftrag mehr als eine Zeile deine Join-Condition erfüllt. Beispiel:
Tabelle X
X1 17.11.2015
X2 18.11.2015
Tabelle Y
Y1 17.11.2015
Y2 17.11.2015
Wenndest du deinen Join hier an bekommst du:
X1 17.11.2015 Y1.17.11.2015
X1 17.11.2015 Y2.17.11.2015
X2 wird z.B. gar nicht ausgeben weil das Datum nicht in Y vorkommt. X1 wird doppelt ausgeben, da in Y zwei Einträge mit dem Datum existieren.
PS:
4) Du nutz LIKE ohne Platzhalter wie %. Dann kannst du auch mit = arbeiten.
5) Du vergleichst eine Spalte die schon Nummer heißt mit einem String der in Anführungsstrichen steht. Natürlich muss die Spalte nicht numerisch sein, aber bei sowas bekomm ich graue Haare.
1) Wenn du als Join-Condition x.datum1 = y.datum2 nimmst, sind diese immer gleich. Du gibst beide im Select-Teil aus, das ist nicht annährend sinnvoll.
2) Dein Join ist nicht explizit benannt. Es wird ein INNER JOIN ausgeführt und ich finde der Klarheit wegen sollte man diesen auch so bennen.
3) Über denn Sinn oder Unsinn, die Inhalte so zu verknüpfen, kann man nur wenige Aussagen treffen ohne den Inhalt und Aufbau der Tabellen zu kennen. Wenn du unerwarteter Weise mehr als eine Zeile pro Eintrag in Tabelle rechnungen zurück bekommst liegt das definitiv daran das in Tabelle auftrag mehr als eine Zeile deine Join-Condition erfüllt. Beispiel:
Tabelle X
X1 17.11.2015
X2 18.11.2015
Tabelle Y
Y1 17.11.2015
Y2 17.11.2015
Wenndest du deinen Join hier an bekommst du:
X1 17.11.2015 Y1.17.11.2015
X1 17.11.2015 Y2.17.11.2015
X2 wird z.B. gar nicht ausgeben weil das Datum nicht in Y vorkommt. X1 wird doppelt ausgeben, da in Y zwei Einträge mit dem Datum existieren.
PS:
4) Du nutz LIKE ohne Platzhalter wie %. Dann kannst du auch mit = arbeiten.
5) Du vergleichst eine Spalte die schon Nummer heißt mit einem String der in Anführungsstrichen steht. Natürlich muss die Spalte nicht numerisch sein, aber bei sowas bekomm ich graue Haare.
Hallo Michael,
auch wenn sich hier schon einige dazu ausgelassen haben, gebe ich auch noch meinen Senf dazu
Was Dir fehlt ist eine Eindeutigkeit in Deiner Verknüpfung. Eine Rechnung bezieht sich mit allergrößter Wahrscheinlichkeit nicht auf alle Aufträge eines Tages. Da sollte es einen eindeutigen Bezug einer Rechnung zu einem Auftrag geben. Z.B. in beiden Tabellen eine AuftragID oder sowas.
In der Tabelle auftrag wirst Du (hoffentlich) irgendeinen Primärschlüssel haben, der dann von Tabelle rechnung aus referenziert wird. Da könnte dann ein Fremdschlüssel drauf sein, anhand dessen Du die Spalte in rechnung feststellen kannst. Der join sollte dann mittels dieser Spalte erfolgen.
Gruß, Mad Max
auch wenn sich hier schon einige dazu ausgelassen haben, gebe ich auch noch meinen Senf dazu
Was Dir fehlt ist eine Eindeutigkeit in Deiner Verknüpfung. Eine Rechnung bezieht sich mit allergrößter Wahrscheinlichkeit nicht auf alle Aufträge eines Tages. Da sollte es einen eindeutigen Bezug einer Rechnung zu einem Auftrag geben. Z.B. in beiden Tabellen eine AuftragID oder sowas.
In der Tabelle auftrag wirst Du (hoffentlich) irgendeinen Primärschlüssel haben, der dann von Tabelle rechnung aus referenziert wird. Da könnte dann ein Fremdschlüssel drauf sein, anhand dessen Du die Spalte in rechnung feststellen kannst. Der join sollte dann mittels dieser Spalte erfolgen.
Gruß, Mad Max