Group By
hawkmaster
- datenbank
Hallo zusammen,
Folgende SQL Abfrage geht in MySQL (auch wenn es vielleicht nicht sauber ist)
SELECT
A.InstallElementID, A.InternalValue, A.TabsJobTkID,
C.English AS GuiName
FROM
typeppdvalue A
JOIN
installelement B ON B.InstallElementID = A.InstallElementID
JOIN
qtext C ON C.TextID = B.TextID
WHERE
A.TypeID = 30
GROUP BY
A.InstallElementID
So bekomme ich 30 Datensätze zurück
Im MS SQL Server kommt hier natürlich eine Fehlermeldung wegen der Group By
Wenn ich das SQL so ändere:
SELECT
A.InstallElementID, A.InternalValue, A.TabsJobTkID,
C.English AS GuiName
FROM
typeppdvalue A
JOIN
installelement B ON B.InstallElementID = A.InstallElementID
JOIN
qtext C ON C.TextID = B.TextID
WHERE
A.TypeID = 30
GROUP BY
A.InstallElementID, A.InternalValue, A.TabsJobTkID,
C.English
Dann wäre es syntaktisch wohl in Ordnung aber ich bekomme 120 Datensätze zurück
Kann man diese SQL Abfrage irgendwie umstellen damit ich trotzdem nur die 30 Datensätze wie im ersten Beispiel bekomme?
vielen Dank und viele Grüße
hawk
Hallo,
Folgende SQL Abfrage geht in MySQL (auch wenn es vielleicht nicht sauber ist)
SELECT
A.InstallElementID, A.InternalValue, A.TabsJobTkID,
C.English AS GuiName
Welche der Spalten, über die Du nicht gruppierst enthält unterschiedliche Werte je Datensatz. Kann ja nur C.English sein, die anderen sollten direkt von A.InstallElementID abhängen.
> So bekomme ich 30 Datensätze zurück
> Im MS SQL Server kommt hier natürlich eine Fehlermeldung wegen der Group By
In allen anderen SQL-Dialekten als dem von MySQL fliegt Dir das Statement um die Ohren. Sogar in MySQL bei entsprechenden Optionen :-)
[...]
> Dann wäre es syntaktisch wohl in Ordnung aber ich bekomme 120 Datensätze zurück
> Kann man diese SQL Abfrage irgendwie umstellen damit ich trotzdem nur die 30 Datensätze wie im ersten Beispiel bekomme?
Wirf die Spalten raus, die unterschiedliche Werte je Gruppe aufweisen. An deren Wert kannst Du ja nicht interessiert sein, weil der Wert unterschiedlich ausfallen kann.
Bessere Idee als Joins und GROUP BY:
Ermittle den GuiName \*nicht\* über Joins sondern über ein Subselect.
Prüfe die Performance beider Varianten (wenn diese das gewünschte Ergebnis liefern).
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
herzlichen Dank für deine Hilfe.
Welche der Spalten, über die Du nicht gruppierst enthält unterschiedliche Werte je Datensatz.
Es lag / liegt an dem InternalValue.
Ich habe nochmals überprüft und festgestellt das dieser garnicht notwendig ist bzw. sinnvoll ist (wie du auc bemerkt hast :-) )
Ich habe also nun den Select reduziert.
In allen anderen SQL-Dialekten als dem von MySQL fliegt Dir das Statement um die Ohren. Sogar in MySQL bei entsprechenden Optionen :-)
ja im Strict Mode oder ?
Bessere Idee als Joins und GROUP BY:
Ermittle den GuiName *nicht* über Joins sondern über ein Subselect.
Das ist auch eine Idee. Werde ich mal testen.
vielen Dank und viele Grüße
hawk