marcel1989
Goto Top

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.

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')  

Content-ID: 388511

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

Ausgedruckt am: 26.11.2024 um 02:11 Uhr

em-pie
em-pie 04.10.2018 um 11:05:56 Uhr
Goto Top
Moin,

hast du es mal mit SELECT DISTINCT .... versucht?
Funktioniert aber nur, wenn alle doppelten Datensätze auch tatsächlich in allen angezeigten Spalten doppelt vorkommen.

Gruß
em-pie
Marcel1989
Marcel1989 04.10.2018 um 11:30:55 Uhr
Goto Top
funktioniert hat es bei mir nicht. Meine Tabelle sieht wie folgt aus:
123


Wie man sieht ist am 29.09.2018 einige Werte doppelt vohanden.
Zum einen kann es aber auch vorkommen das es 3 zusätze gibt. Also dann die Zeile verdreifacht wird.

Und am Ende will ich das Siloname ist und soll ein Feld sind.
und darunter dann der zweite Silename ist und soll

und ggf wenn vorhanden dann
3ter Siloname ist uns soll


Ich hoffe man versteht was ich meine

Gruß
Marcel
ukulele-7
ukulele-7 04.10.2018 um 13:14:31 Uhr
Goto Top
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().
em-pie
em-pie 04.10.2018 um 13:55:57 Uhr
Goto Top
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.
Marcel1989
Marcel1989 04.10.2018 um 14:59:14 Uhr
Goto Top
Ok, da wir immernoch nicht gleich denken

Ich hab ein Bild angehängt.
das es etwas anschaulicher darstellt.

Mein "Zeitpunkt" ist ein unique index. Also ist es ansich nicht möglich 2 mal die gleiche Zeile zu haben. die wird erst erstellt (in der View) wenn ich left join anhand der Zeit mache, weil eben 2 ergebnisse gefunden werden für die Uhrzeit.

In der Tabelle Silo ist es so das für ein Rezept mehrere zusammenstellungen sind und in der Silo steht eben die Datetime mit dem Namen vom Silo was verwendet wurde (beispiel Feldspat) und das wird dann mit anderen Sachen gemischt (geschieht ja auch um die Uhrzeit) und deshalb gibt es dann eben auch mal 2 ergebnisse in Silo für eine Suche.

Wie könnten ich das denn lösen?

Damit eben wie im Bild beschrieben z.B. am 29.09.2018 um 09:31:10 das sowohl der Feldspat als auch das Pulverharz in einer Zeile ausgegeben werden.

Nutze ich Group by Zeitpunkt dann zeigt er mit das Pulverharz nicht mehr an. Nutze ich Group_Concat dann zeit er mir nun noch alle in der Tabelle befindlichen Zeilen in eine an. (zumindest weiß ich hier nicht genau wie ich das in einer Left Join verwenden soll)

Gruß
Marcel

PS: danke für die hilfe
123
ukulele-7
ukulele-7 04.10.2018 um 16:01:07 Uhr
Goto Top
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
Marcel1989
Marcel1989 04.10.2018 um 16:15:39 Uhr
Goto Top
Das Ergebniss.
Ich dank dir wirklich du hilft mir immer wieder den richtigen weg zu finden. Vielleicht fehlt hier einfach noch irgendwas. Ich werd mal bisschen rumprobieren.
Wenn es allerdings jemand schon weiß ruhig raus damit face-smile

Gruß
Marcel
123