Cuando estás usando GROUP BY
normalmente tendrá funciones agregadas
, el SQL que proporcionó en realidad no tiene ninguna función agregada, por lo que no es necesario agruparlo.
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
El error se produce porque todas las columnas no agregadas deben definirse en GROUP BY
ya que esto define cómo se calculan las otras columnas (agregadas). En su caso y dado el problema descrito, supongo que simplemente eliminando el GROUP BY
resolverá su 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 después del comentario sobre entradas duplicadas:
La siguiente consulta obtendrá la entrada más reciente 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
Esto está lejos de ser ideal, pero podría usarse como una subconsulta para seleccionar el texto relevante de la siguiente manera:
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
No me gusta usar subconsultas como esta, pero soy un desarrollador, no un DBA, y lo anterior está limitado de tal manera que si hay elementos con Chat_Relation_Id
idénticos y DateTime
entonces todavía se producirán duplicados. Probablemente haya una forma inteligente de hacerlo utilizando un HAVING
Cláusula
pero con suerte, si esto no le da algo para trabajar, ayudará a otra persona a resolver su problema.