Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Erro de consulta SQL na cláusula Group By e Order By


Quando você está usando GROUP BY você normalmente terá funções agregadas , o SQL que você forneceu na verdade não possui nenhuma função agregada, portanto, não há necessidade de agrupá-lo.
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

O erro está sendo lançado porque todas as colunas não agregadas devem ser definidas no GROUP BY cláusula, pois define como as outras colunas (agregadas) são calculadas. Na sua instância e dado o problema descrito, estou supondo apenas remover o GROUP BY resolverá seu problema.
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

Editar após comentário sobre entradas duplicadas:

A consulta a seguir obterá a entrada mais recente para cada Chat_Relation_Id
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 

Isso está longe de ser o ideal, mas pode ser usado como uma subconsulta para selecionar o texto relevante da seguinte maneira:
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

Não gosto de usar subconsultas como esta, mas sou um desenvolvedor, não um DBA, e o acima é limitado de forma que, se houver itens com Chat_Relation_Id idêntico e DateTime então as duplicatas ainda ocorrerão. Provavelmente existe uma maneira inteligente de fazer isso usando um HAVING Cláusula mas espero que, se isso não lhe der algo para trabalhar, ajude outra pessoa a resolver seu problema.