mist
Goto Top

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:

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

Content-Key: 288570

Url: https://administrator.de/contentid/288570

Printed on: May 10, 2024 at 09:05 o'clock

Member: wiesi200
wiesi200 Nov 17, 2015 at 09:28:59 (UTC)
Goto Top
Hallo,

Ist doch klar. Du verknüpfst die Rechnung mit jedem Auftrag mit dem gleichen Datum. Somit eine 1:n Verknüpfung und du bekommst n Ergebnisse
Member: rzlbrnft
rzlbrnft Nov 17, 2015 at 09:31:21 (UTC)
Goto Top
Ich weiß ja nicht welche SQL Version du benutzt oder wo welche Daten liegen, aber join allein wird wohl nicht reichen.
Wird wahrscheinlich eine Art cross join rauskommen, du brauchst aber einen inner join.
Member: wiesi200
wiesi200 Nov 17, 2015 at 09:38:14 (UTC)
Goto Top
Effektiv ist so die Abfrage doch ein blödsinn.
Ein datumsfeld ist normal nicht gerade geeignet ne Rechnung mit nem Auftrag zu verknüpfen. Solange man garantiert nicht mehr Aufträge / Rechnungen pro Tag hat.
Member: MiSt
MiSt Nov 17, 2015 at 09:39:26 (UTC)
Goto Top
sybase

Ich glaube, ich muss mich ein wenig mehr einlesen...
Member: MiSt
MiSt Nov 17, 2015 at 09:43:56 (UTC)
Goto Top
Zitat von @wiesi200:

Effektiv ist so die Abfrage doch ein blödsinn.
Ein datumsfeld ist normal nicht gerade geeignet ne Rechnung mit nem Auftrag zu verknüpfen. Solange man garantiert nicht mehr Aufträge / Rechnungen pro Tag hat.

mit <=curdate() möchte ich mir alle rückständigen Aufträge (Rechnung war das falsche Wort) anschauen.
später mit sum(betrag)asGesamt den kompletten Wert.

Ich wollte mich da langsam "rantasten". Deswegen erstmal nur der eine bestimmte Auftrag 0815
Member: MiSt
MiSt Nov 17, 2015 at 09:46:10 (UTC)
Goto Top
...und leider gibt es 2 Lieferdaten. Eines in der einen Tabelle und das andere in der anderen Tabelle. Das in Tabelle X hat vorrang und wenn da keines steht, zieht nur Y
Member: ukulele-7
ukulele-7 Nov 17, 2015 updated at 10:25:43 (UTC)
Goto Top
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.
Member: MadMax
MadMax Nov 17, 2015 at 11:23:44 (UTC)
Goto Top
Hallo Michael,

auch wenn sich hier schon einige dazu ausgelassen haben, gebe ich auch noch meinen Senf dazu face-smile

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
Member: MiSt
MiSt Nov 17, 2015 at 11:46:45 (UTC)
Goto Top
Vielen Dank. Ich versuche das anhand des Schlüssels.