hawkmaster: Group By

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

  1. 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
    
    1. 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