Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mi 06.04.16 13:37 
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

ausblenden 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

ausblenden 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 user profile iconChristian S.: C#- durch SQL-Tags ersetzt


Zuletzt bearbeitet von Talemantros am Mi 06.04.16 13:42, insgesamt 1-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 06.04.16 13: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mi 06.04.16 13:43 
Hallo Ralf,
genau. mein Edit hatte sich gerade mit deiner Antwort überschnitten.

Danke

Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 06.04.16 14:07 
Dann wirst du einen Group By im Kombination mit der Group_Concat Methode brauchen.

Da ich kein MySql Benutzer bin und SqlFiddle gerade nicht funktioniert (Die Seite schafft es nicht mehr durch meine 'AdBlock-Disconnect-NoScript-MachDasInternetBenutzbar'-Mauer) um es auszuprobieren kann ich dir das leider nicht zeigen wie das aussehen sollte.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mi 06.04.16 14:40 
Hi,
danke für den Hinweis, dann versuche ich mich daran mal.

Gruß

Edit:
Hat geklappt

ausblenden 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 user profile iconChristian S.: C#- durch SQL-Tags ersetzt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 06.04.16 15: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mi 06.04.16 15: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ß
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 06.04.16 16:01 
Zitat:
Falsch?


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 07.04.16 21:03 
Hey,
du hattest Recht, nach einigen Tests war der SubSelect falsch

Habe nun folgendes was funktioniert:

ausblenden 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 user profile iconChristian S.: C#- durch SQL-Tags ersetzt