jackle32 - Sa 28.12.13 01:56
Titel: SQL Abfrage aus drei Tabellen
Hallo zusammen,
ich habe mal eine Frage bezüglich SQL abfragen. Und zwar habe ich folgende Situation.
Ich habe drei Tabellen: Person, Meter und Mannschaft.
In Person gibt es die Felder: Nummer, Vorname, Nachname, Mannschaft (als Index)
In Meter gibt es: Nummer, Personindex und Meter
In Mannschaft gibt es: Nummer und Mannschaftsname
So jetzt möchte ich eine SQL abfrage starten, die in Meter die gleichen Personenindex erkennt und deren Summe von Meter zurückgibt.
Anschließen möchte ich die Summe der Meter und den Mannschaftsnamen einer Person zuordnen, so dass mein fertig Tabelle ungefähr den Aufbau hat.
Person.Nummer, Nachname, Vorname, Mannschaftsname (als Text), Summe(Meter), ideal wäre noch Meter der gesamten zugehörigen Mannschaft
Ich habe auch schon mehrere Varianten ausprobiert bin aber zu keinem richtigen Ergebnis gekommen.
Eine Variante wäre:
SQL-Anweisung
1:
| SELECT Person.Nummer, Person.Vorname, Person.Nachname, Mannschaft.MName, sum(Meter.Meter) Meter FROM Person, Meter, Mannschaft WHERE (Person.Nummer=Meter.Personindex) and (Person.Mannschaft = Mannschaft.Nummer) GROUP BY Person.Nummer, Person.Vorname, Person.Nachname, Mannschaft.MName ORDER BY Meter DESC |
Dabei ist das Problem, dass immer nur ein Teilnehmer pro Mannschaft ausgegeben wird.
Eine andere Variante wäre:
SQL-Anweisung
1:
| Select t2.mName Mannschaftsname, t1.nachname Nachname, t1.vorname Vorname, t3.Strecke Strecke From Person t1, Mannschaft t2, (SELECT T1.Nummer Nummer, SUM(T2.Meter) Strecke FROM Person T1, Meter T2 where T1.Nummer=T2.Personindex group by T1.Nummer order by Strecke DESC) T3 where t1.mannschaft=t2.Nummer and t2.nummer=t3.Nummer group by t2.mname, Nachname, Vorname, Strecke order by Mannschaftsname |
Dabei ist das Problem, dass die zugeordneten Summen der Meter nicht stimmen (und ich weiß nicht warum).
Als Datenbank benutze ich die embedded Variante der NexusDB. Compiler ist Delphi XE5 auf einem Windows 7 Rechner.
Hoffe mir kann jemand weiter helfen.
Gruß,
Jack
jackle32 - Sa 28.12.13 15:07
Hallo und danke für die Antworten,
der Ansatz von Narses hat mich auf die Richtige Spur gebracht. Meine jetzt Lösung sieht so aus:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8:
| SELECT Person.Nummer, Person.Vorname, Person.Nachname, Mannschaft.MName, SUM(Meter.Meter) FROM Person LEFT JOIN Meter ON Person.Nummer = Meter.Personindex LEFT JOIN Mannschaft ON Person.Mannschaft = Mannschaft.Nummer GROUP BY Person.Nummer, Person.Vorname, Person.Nachname, Mannschaft.MName |
Hab dazu aber noch ne Frage und zwar ist bei den anderen Lösungen in GROUP BY nur "Person.Nummer" aufgeführt. Wenn ich das aber so stehen lasse, kommt immer die Fehlermeldung:
Quelltext
1: 2:
| NexusDB: Query2613049335: Query execution failed: Error in statement: Column references must either be in aggregate functions or grouped on: "Person.Vorname" |
Kann mir jemand erklären warum?
Gruß,
Jack
Narses - Sa 28.12.13 18:36
Moin!
jackle32 hat folgendes geschrieben : |
Hab dazu aber noch ne Frage und zwar ist bei den anderen Lösungen in GROUP BY nur "Person.Nummer" aufgeführt. Wenn ich das aber so stehen lasse, kommt immer die Fehlermeldung:
Quelltext 1: 2:
| NexusDB: Query2613049335: Query execution failed: Error in statement: Column references must either be in aggregate functions or grouped on: "Person.Vorname" | |
Weil dein (R?)DBMS ähnlich wie MS Access darauf besteht (unflexiblerweise, allerdings, das ärgert mich jedesmal bei dem blöden Access), dass alle Spalten der Ergebnismenge beim Gruppieren explizit gruppiert oder aggregiert werden müssen. :nixweiss: Dagegen kann man so nix machen, höchstens eine andere DB nehmen. ;)
cu
Narses