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.