SQL Problem mit Left Join 2er Tabellen
Hi,
Ich hab das Problem wenn ich eine Tabelle (name: aufbereitet) mit der Tabelle enddaten zusammenfüge passt noch alles.
Füge ich nun die Tabelle Silo noch hinzu bekomme ich leider mehrfach doppelte Zeilen.
Grund dafür ist das in der Tabelle Silo anhand des Zeitpunkts 2 Werte gefunden werden (was korrekt ist).
Die werden dann in 2 Zeilen ausgegeben.
Hab ich irgendwie die Möglichkeit diese doppelten Ergebnisse dann als String in einer Zeile auszugeben?
wäre wirklich wichtig. danke.
Ich hab das Problem wenn ich eine Tabelle (name: aufbereitet) mit der Tabelle enddaten zusammenfüge passt noch alles.
Füge ich nun die Tabelle Silo noch hinzu bekomme ich leider mehrfach doppelte Zeilen.
Grund dafür ist das in der Tabelle Silo anhand des Zeitpunkts 2 Werte gefunden werden (was korrekt ist).
Die werden dann in 2 Zeilen ausgegeben.
Hab ich irgendwie die Möglichkeit diese doppelten Ergebnisse dann als String in einer Zeile auszugeben?
wäre wirklich wichtig. danke.
SELECT
aufbereitet.Zeitpunkt,
aufbereitet.Rezept,
aufbereitet.Charge,
aufbereitet.HarzTemp,
aufbereitet.Feuchtestufe,
aufbereitet.GewichtMischung,
aufbereitet.FluessigHarz,
aufbereitet.Tara,
enddateien.Staub,
silo.SiloName,
silo.Ist,
silo.Soll
FROM aufbereitet
LEFT JOIN enddateien ON aufbereitet.Charge = enddateien.Charge
inner JOIN silo ON DATE_FORMAT(aufbereitet.Zeitpunkt, '%d.%m.%y %H:%i') = DATE_FORMAT(silo.Zeitpunkt, '%d.%m.%y %H:%i')
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 388511
Url: https://administrator.de/contentid/388511
Ausgedruckt am: 26.11.2024 um 02:11 Uhr
7 Kommentare
Neuester Kommentar
Dein Join ist auf jedenfall richtig, du hast im wesentlichen drei Möglichkeiten:
a) Du grenz deinen Join weiter ein so das nur eine Zeile in Tabelle Silo betroffen ist. Das scheint mir hier nicht so einfach aber ich verstehe die Daten nicht als Außenstehender.
b) Du sortierst die Daten und nimmst nur den jeweils ersten Wert. Dazu musst du nicht die Tabelle sondern einen Select auf die Tabelle joinen, Beispiel:
[CODE]SELECT * FROM A JOIN ( SELECT ROW_NUMBER() OVER (PARTITION BY fkA ORDER BY spalte) AS zeile,* FROM B ) B ON A.pk = B.fkA AND B.zeile = 1[/CODE]
Das hängt aber davon ab welches DBMS du nutzt, mir scheint MySQL? Welche Version?
c) Du nutzt GROUP BY und aggregierst oder gruppierst alle Spalten. Auch hier muss dann eventuell Silo.Name (String) mit einer DBMS-spezifischen Funktion ermittelt werden, unter MySQL gibts group_concat().
a) Du grenz deinen Join weiter ein so das nur eine Zeile in Tabelle Silo betroffen ist. Das scheint mir hier nicht so einfach aber ich verstehe die Daten nicht als Außenstehender.
b) Du sortierst die Daten und nimmst nur den jeweils ersten Wert. Dazu musst du nicht die Tabelle sondern einen Select auf die Tabelle joinen, Beispiel:
[CODE]SELECT * FROM A JOIN ( SELECT ROW_NUMBER() OVER (PARTITION BY fkA ORDER BY spalte) AS zeile,* FROM B ) B ON A.pk = B.fkA AND B.zeile = 1[/CODE]
Das hängt aber davon ab welches DBMS du nutzt, mir scheint MySQL? Welche Version?
c) Du nutzt GROUP BY und aggregierst oder gruppierst alle Spalten. Auch hier muss dann eventuell Silo.Name (String) mit einer DBMS-spezifischen Funktion ermittelt werden, unter MySQL gibts group_concat().
Für mich sieht das auch alles richtig aus.
Und es gibt bei dir keine doppelten EInträge.
Aufgrund deines Join-Konstrukts ergibt sich eben, dass es für jedes Datum mehrere SILO-Sätze findet.
Ich wüsste jetzt nicht, welches SILO ich als einziges darstellen sollte. Dies müsstest du selbst heraus selektieren. Mögliche Wege dazu hat dir @ukulele-7 ja schon genannt.
Und es gibt bei dir keine doppelten EInträge.
Aufgrund deines Join-Konstrukts ergibt sich eben, dass es für jedes Datum mehrere SILO-Sätze findet.
Ich wüsste jetzt nicht, welches SILO ich als einziges darstellen sollte. Dies müsstest du selbst heraus selektieren. Mögliche Wege dazu hat dir @ukulele-7 ja schon genannt.
Ich würde schon sagen das wir dich verstehen, du scheinst nur mit GROUP_CONCAT nicht geschafft zu haben was du wolltest. Hier mal ein Vorschlag (ich mache allerdings i.d.R. MSSQL, kann sein das das noch minimal angepasst werden muss):
SELECT
aufbereitet.Zeitpunkt,
aufbereitet.Rezept,
aufbereitet.Charge,
aufbereitet.HarzTemp,
aufbereitet.Feuchtestufe,
aufbereitet.GewichtMischung,
aufbereitet.FluessigHarz,
aufbereitet.Tara,
enddateien.Staub,
GROUP_CONCAT(silo.SiloName + ' ' + cast(silo.Ist AS VARCHAR(20)) + '/' + cast(silo.Soll AS VARCHAR(20)) ORDER BY silo.Soll DESC SEPARATOR ';') AS silo
FROM aufbereitet
LEFT JOIN enddateien ON aufbereitet.Charge = enddateien.Charge
inner JOIN silo ON DATE_FORMAT(aufbereitet.Zeitpunkt, '%d.%m.%y %H:%i') = DATE_FORMAT(silo.Zeitpunkt, '%d.%m.%y %H:%i')
GROUP BY
aufbereitet.Zeitpunkt,
aufbereitet.Rezept,
aufbereitet.Charge,
aufbereitet.HarzTemp,
aufbereitet.Feuchtestufe,
aufbereitet.GewichtMischung,
aufbereitet.FluessigHarz,
aufbereitet.Tara,
enddateien.Staub