När du använder GROUP BY
du kommer normalt att ha samlade funktioner
, SQL-koden du angav har faktiskt inga samlade funktioner i sig så det finns inget behov av att gruppera den.
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
Felet skapas eftersom alla icke aggregerade kolumner måste definieras i GROUP BY
sats eftersom denna definierar hur de andra (sammanlagda) kolumnerna beräknas. I ditt fall och med tanke på problemet som beskrivs, gissar jag att du bara tar bort GROUP BY
kommer att lösa ditt problem.
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
Redigera efter kommentar angående dubblerade poster:
Följande fråga kommer att få den senaste posten för varje 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
Detta är långt ifrån idealiskt, men kan användas som en underfråga för att välja relevant text enligt följande:
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
Jag gillar inte att använda underfrågor som denna, men jag är en utvecklare inte en DBA, och ovanstående är begränsat så att om det finns objekt med identiskt Chat_Relation_Id
och DateTime
då kommer dubbletter fortfarande att förekomma. Det finns förmodligen ett smart sätt att göra det med en HAVING
Klausul
men förhoppningsvis kommer det att hjälpa någon annan att lösa ditt problem om detta inte ger dig något att arbeta utifrån.