Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - MySQL Abfrage // 2 Abfragen "verknüpfen"
Talemantros - Mi 06.04.16 12:37
Titel: MySQL Abfrage // 2 Abfragen "verknüpfen"
Hallo zusammen,
nach einiger Zeit ohne C# muss ich mich mal wieder damit beschäftigen und habe direkt am 2ten Tag ein kleines Problem mit einer Datenbankabfrage.
Ich versuche mal zu beschreiben was ich meine:
Ich habe eine Abfrage, die mir die Grunddaten eines Behälters ermittelt in einer Tabelle "oktabinergrund"
1.) Behälternummer
2.) Material
3.) Chargenbereich
4.) Gewicht in KG
C#-Quelltext
1: 2: 3: 4: 5: 6:
| strSQl = @"Select oktabinergrund.oktabinergrundid, oktabinergrund.oktnummer, schrottart.schrottart, bestand.chargenbereich, oktabinergrund.netto from oktabinergrund left join oktabinerinhalt on oktabinerinhalt.oktabinergrundid=oktabinergrund.oktabinergrundid left join bestand on bestand.bestandid = oktabinerinhalt.bestandid left join schrottart on schrottart.schrottartid = bestand.schrottartid where oktabinergrund.oktabinergrundid = ?oktabinergrundid"; |
Nun soll zwischen "Chargenbereich" und "Gewicht in KG" eine Auflistung, welche Behälter aus dem Warenbestand in diesem Oktabiner sind.
Da dies mehrere Waren sein könnten, weil ich gerade nicht weiter.
Mit folgender Abfrage könnte ich die Behälter ermitteln
SQL-Anweisung
1: 2: 3: 4:
| Select behaelternummer from oktabinergrund left join oktabinerinhalt on oktabinerinhalt.oktabinergrundid=oktabinergrund.oktabinergrundid left join bestand on bestand.bestandid = oktabinerinhalt.bestandid where oktabinergrund.oktabinergrundid = ?oktabinergrund |
Ziel wäre:
1.) Behälternummer
2.) Material
3.) Chargenbereich
4.) Behälter 1
5.) Behälter 2 etc.
6.) Gewicht in KG
Es ist sicher irgenwdie möglich diese Abfragen zu einer einzigen zu verknüpfen?!
Danke
Gruß
Edit: Wie ich ein Subquery einbaue weiß ich theoretisch.
Fehler ist, dass das Subquey immer mehr wie eine Zeile ausgibt.
Moderiert von Christian S.: C#- durch SQL-Tags ersetzt
Ralf Jansen - Mi 06.04.16 12:42
Nur zum Verständnis du könntest im ersten Sql einfach die Behälternummer mit ausgeben. Bekämmst aber je Behälternummer einen Datensatz du willst aber nur einen Datensatz die in einer Spalte eine Liste von Behälternummer enthält?
Talemantros - Mi 06.04.16 12:43
Hallo Ralf,
genau. mein Edit hatte sich gerade mit deiner Antwort überschnitten.
Danke
Gruß
Talemantros - Mi 06.04.16 13:40
Hi,
danke für den Hinweis, dann versuche ich mich daran mal.
Gruß
Edit:
Hat geklappt
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Select oktabinergrund.oktabinergrundid, oktabinergrund.oktnummer, schrottart.schrottart, bestand.chargenbereich, Group_Concat((Select behaelternummer from oktabinergrund left join oktabinerinhalt on oktabinerinhalt.oktabinergrundid=oktabinergrund.oktabinergrundid left join bestand on bestand.bestandid = oktabinerinhalt.bestandid where oktabinergrund.oktabinergrundid = ?oktabinergrundid group by oktabinergrund.oktabinergrundid)), oktabinergrund.netto from oktabinergrund left join oktabinerinhalt on oktabinerinhalt.oktabinergrundid=oktabinergrund.oktabinergrundid left join bestand on bestand.bestandid = oktabinerinhalt.bestandid left join schrottart on schrottart.schrottartid = bestand.schrottartid where oktabinergrund.oktabinergrundid = ?oktabinergrundid group by oktabinergrund.oktabinergrundid |
Muss es nur noch umbauen, auf mehrere mögliche Ids des Oktabiners.
Sollte aber kein Problem darstellen.
Moderiert von Christian S.: C#- durch SQL-Tags ersetzt
Ralf Jansen - Mi 06.04.16 14:02
Das funktioniert so?
Im allgemeinen Fall mußt du alle Felder die im select stehen (außer das mit im Group_concat) im group by auch benennen.
Warum du darin einen Subselect verwendest erschließt sich mir gerade nicht. Solltest du nicht einfach Group_Concat(oktabinergrund.behaelternummer) benutzen können?
Talemantros - Mi 06.04.16 14:14
Hi,
ich habe es bisher nur in der HeidiSQL auf meiner DB getestet, hatte aber ein richtiges Ergebnis erhalten.
Den SubSelect hatte ich verwendet, da die Behälternummern in der Tabelle "Bestand" stehen und dort auf mehrere Ids verteilt sind!
In der Oktabinergrund stehen die Grunddaten des Oktabiners
in der Oktabinerinhalt die Waren, die in dem Oktabiner sind
Und in Bestand die Details der Ware
Falsch?
Gruß
Ralf Jansen - Mi 06.04.16 15:01
Kein Ahnung ;) Mir fehlen spezielle Kenntnisse in MySql. Für mich sieht der Subselect genauso aus wie der umgebende Select bis auf die Schrottart da die aber per Left join dran hängt ist somit also eher irrelevant. Wenn ich Group_Concat richtig verstanden hatte, woran ich gerade etwas zweifele, sollte
Group_Concat(oktabinergrund.behaelternummer) reichen.
Wenn du es so machst kommt dann Unsinn raus? Dann machst du es mit dem Subselect richtig. Man könnte da dann dem Subselect noch ein Distinct hinzufügen(auf deinem Bild ist ja di eBehälterbezeichnung doppelt was vermutlich nicht hilfreich ist).
Talemantros - Do 07.04.16 20:03
Hey,
du hattest Recht, nach einigen Tests war der SubSelect falsch
Habe nun folgendes was funktioniert:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8:
| Select oktabinergrund.oktabinergrundid, oktabinergrund.oktnummer, schrottart.schrottart, bestand.chargenbereich, Group_Concat(bestand.behaelternummer), oktabinergrund.netto from oktabinergrund left join oktabinerinhalt on oktabinerinhalt.oktabinergrundid=oktabinergrund.oktabinergrundid left join bestand on bestand.bestandid = oktabinerinhalt.bestandid left join schrottart on schrottart.schrottartid = bestand.schrottartid where oktabinergrund.oktabinergrundid = 1 group by oktabinergrund.oktabinergrundid |
Vielen Dank
Gruß
Moderiert von Christian S.: C#- durch SQL-Tags ersetzt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!