Laden...

MySQL <-> MSSQL unterschiedliches Verhalten beim GROUP BY

Erstellt von bbb vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.431 Views
B
bbb Themenstarter:in
72 Beiträge seit 2009
vor 10 Jahren
MySQL <-> MSSQL unterschiedliches Verhalten beim GROUP BY

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.

3.825 Beiträge seit 2006
vor 10 Jahren

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

1.696 Beiträge seit 2006
vor 10 Jahren

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.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

16.842 Beiträge seit 2008
vor 10 Jahren

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.

B
bbb Themenstarter:in
72 Beiträge seit 2009
vor 10 Jahren

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!

3.825 Beiträge seit 2006
vor 10 Jahren

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

B
bbb Themenstarter:in
72 Beiträge seit 2009
vor 10 Jahren

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?

1.696 Beiträge seit 2006
vor 10 Jahren

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.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

C
2.122 Beiträge seit 2010
vor 10 Jahren

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.

B
bbb Themenstarter:in
72 Beiträge seit 2009
vor 10 Jahren

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.