verwendetes Datenbanksystem: MySQL & MSSQL
Hallo zusammen,
ich verwende überwiegend MySQL und bin schon öfter über ein, für mich ärgerliches Verhalten, bei MSSQL gestolpert. Folgende Query wird von MySQL anstandslos bearbeitet:
SELECT SpalteA, SpalteB
FROM Table1
GROUP BY SpalteA
Selbe Query auf einer MSSQL-Datenbank führt zu folgender Fehlermeldung:
Die 'SpalteB'-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Meine Frage: Wieso ist das so? Und welche Möglichkeiten habe ich auf einer MSSQL-DB, wenn ich genau dieses Ergebnis haben möchte, was mir die MySQL-DB liefert?
P.S. Dieses unterschiedliche Verhalten ist nicht nur auf MySQL <-> MSSQSL zu beschränken. Auch eine Postgres DB verhält sich wie die MSSQL.
Hallo bbb,
die Fehlermeldung ist richtig, da SpalteB nicht eindeutig ist. Willst Du den ersten Wert, oder den letzten, oder die Summe ?
Dass MySQL einen Wert anzeigt ist eigentlich nicht richtig. Welcher Wert ist das denn ?
Eventuell das SQL-Statement ändern in
SELECT SpalteA, SpalteB
FROM Table1
GROUP BY SpalteA,SpalteB
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
MySQL tanzt einfach aus der Reihe und ist daher nicht ganz ANSI-Konform. Bei allen großen, bekannten DBMS (ORACLE, DB2, SyBase, MSSQL, ...) muss man immer alle Spalten gruppieren, die ausgewählt und nicht in Aggregatfunktion sind, was auch verständlich ist, denn welchen Wert von SpalteB erwartest du, wenn du nach SpalteA gruppierst, wenn z.B. von 3 Zeilen A=1, B aber aus 1,2,3 besteht? Von daher ist das Verhalten von MySQL von der Logik her eher nicht normal.
**:::
mySQL erlaubt Group ohne Aggregat; das tut MSSQL nicht.
Siehe Dokumentation 12.15.3 MySQL Extensions to GROUP BY
Streng genommen ist das kein Fehlverhalten von MSSQL, sondern von mySQL.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hmm, ich versuche mal ein Beispiel zu konstruieren:
Folgende Tabelle:
Name | Amount
Peter | 10
Peter | 25
Hans | 15
Peter | 17
Hans | 20
Willi | 30
Möchte ich in MySQL hier nun mit einer Query den Namen und den dazu gehörigen höchsten Amount-Wert haben, mache ich folgendes:
SELECT name, max(amount)
FROM table
GROUP BY Name
Das Ergebnis wäre:
Peter | 25
Hans | 20
Willi | 30
Das MSSQL Ergebnis - da ich hier dem GROUP-Statement noch den Amount hinzufügen müsste wäre folgendes:
Peter | 10
Peter | 25
Hans | 15
Peter | 17
Hans | 20
Willi | 30
Ich denke daran ist leicht zu erkennen, wie leicht ich per MySQL zu meinem Ergebnis komme. Bei MSSQL müsste ich wohl mit deutlich aufwändigeren Unter-Selections arbeiten.
Schade, dass das nicht möglich ist. Dennoch danke für die Klarstellung!
und den dazu gehörigen höchsten Amount-Wert
Dann sag MSSQL doch dass Du den höchsten Wert haben willst (max).
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Dann sag MSSQL doch dass Du den höchsten Wert haben willst (max).
Ja, genau. Würde ich doch wie folgt:
SELECT name, max(amount)
FROM table
GROUP BY Name, amount
Das Ergebnis habe ich doch in meiner letzten Antwort beschrieben und entspricht nicht meinem erwarteten. Oder wie sähe deine Query aus?
Möchte ich in MySQL hier nun mit einer Query den Namen und den dazu gehörigen höchsten Amount-Wert haben, mache ich folgendes:
SELECT name, max(amount) FROM table GROUP BY Name
Das Ergebnis wäre:
Peter | 25 Hans | 20 Willi | 30
unter MSSQL sollte es auch genauso funktionieren, wo ist das Problem?
BTW. Du sprachst vorhin von 2 selektierte Spalten, jetzt nicht mehr (!)
edit:
Das Ergebnis habe ich doch in meiner letzten Antwort beschrieben und entspricht nicht meinem erwarteten.
Ich denke, es ist nicht das Ergebnis von obige Abfrage. Bitte überprüfe das mal.
**:::
Das MSSQL Ergebnis - da ich hier dem GROUP-Statement noch den Amount hinzufügen müsste wäre folgendes:
Da bringst du was durcheinander. MSSQL bringt hier auch nur die drei Zeilen mit dem jeweils Maximalwert pro Name.
Bau mal dein Beispiel um in etwas das den Fehler bringt, dann wird vielleicht klarer was du hier wirklich tust.
Ich denke, es ist nicht das Ergebnis von obige Abfrage. Bitte überprüfe das mal.
Ja, das habe ich jetzt mal gemacht. Du hast recht. Das geht auch. Hatte mich da vertan. Ich meine allerdings schon öfters vor ähnlichen Problemen gestanden zu haben, bei denen mir die etwas erweiterte Auslegung des GROUP BY von MySQL bessere Dienste geleistet hatte. Leider habe ich dafür gerade kein passendes Beispiel parat.
Aber wie gesagt, ich danke euch für die Klarstellung.