Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Abfragefehler in den Klauseln „Group By“ und „Order By“.

Wenn Sie GROUP BY verwenden Sie haben normalerweise Aggregatfunktionen , enthält die von Ihnen bereitgestellte SQL keine Aggregatfunktionen, sodass sie nicht gruppiert werden muss.

SELECT  
    m.Message_Id 
    , m.Chat_Relation_Id AS relation_id 
    , m.SenderId AS datetime 
    , m.Text_Message 
    , m.Subject 
    , m.DateTime
FROM  
    [AppResource].[dbo].[ChatMessage] AS m  
    INNER JOIN [AppResource].[dbo].[chatRelation] AS r 
    ON r.Chat_Relation_Id = m.Chat_Relation_Id 
WHERE  
    r.User1Id=1 
GROUP BY 
    m.Chat_Relation_Id 
ORDER BY  
    m.DateTime desc

Der Fehler wird ausgelöst, weil alle nicht aggregierten Spalten in GROUP BY definiert werden müssen -Klausel, da diese definiert, wie die anderen (aggregierten) Spalten berechnet werden. In Ihrem Fall und angesichts des beschriebenen Problems nehme ich an, dass Sie einfach GROUP BY entfernen wird Ihr Problem lösen.

SELECT  
    m.Message_Id 
    , m.Chat_Relation_Id AS relation_id 
    , m.SenderId AS datetime 
    , m.Text_Message 
    , m.Subject 
    , m.DateTime
FROM  
    [AppResource].[dbo].[ChatMessage] AS m  
    INNER JOIN [AppResource].[dbo].[chatRelation] AS r 
    ON r.Chat_Relation_Id = m.Chat_Relation_Id 
WHERE  
    r.User1Id = 1 
ORDER BY  
    m.DateTime DESC

Nach Kommentar zu doppelten Einträgen bearbeiten:

Die folgende Abfrage ruft den neuesten Eintrag für jede Chat_Relation_Id ab

SELECT  
    m.Chat_Relation_Id AS relation_id 
    , MAX(m.DateTime) AS maxDateTime
FROM  
    [AppResource].[dbo].[ChatMessage] AS m  
    INNER JOIN [AppResource].[dbo].[chatRelation] AS r 
    ON r.Chat_Relation_Id = m.Chat_Relation_Id 
WHERE  
    r.User1Id = 1 
GROUP BY 
    m.Chat_Relation_Id 

Dies ist alles andere als ideal, könnte aber als Unterabfrage verwendet werden, um den relevanten Text wie folgt auszuwählen:

SELECT  
    m.Message_Id 
    , m.Chat_Relation_Id AS relation_id 
    , m.SenderId AS datetime 
    , m.Text_Message 
    , m.Subject 
    , m.DateTime
FROM  
    (SELECT  
        subqueryMessage.Chat_Relation_Id AS relation_id 
        , MAX(subqueryMessage.DateTime) AS maxDateTime
    FROM  
        [AppResource].[dbo].[ChatMessage] AS subqueryMessage  
        INNER JOIN [AppResource].[dbo].[chatRelation] AS subQueryRelation 
        ON subQueryRelation.Chat_Relation_Id = subqueryMessage.Chat_Relation_Id 
    WHERE  
        subQueryRelation.User1Id = 1 
    GROUP BY 
        subqueryMessage.Chat_Relation_Id 
    ) AS mySubQuery
    INNER JOIN [AppResource].[dbo].[ChatMessage] AS m  
    ON  m.Chat_Relation_Id = mySubQuery.relation_id
        AND m.DateTime = mySubQuery.maxDateTime
ORDER BY  
    m.DateTime DESC

Ich mag es nicht, Unterabfragen wie diese zu verwenden, aber ich bin ein Entwickler, kein DBA, und das Obige ist so eingeschränkt, dass es Elemente mit identischer Chat_Relation_Id gibt und DateTime dann treten immer noch Duplikate auf. Es gibt wahrscheinlich einen cleveren Weg, dies mit einem HAVING zu tun Klausel Aber hoffentlich hilft es jemand anderem, Ihr Problem zu lösen, wenn es Ihnen nichts bringt, womit Sie arbeiten können.