Når du bruger GROUP BY
du vil normalt have samlede funktioner
, den SQL, du har angivet, har faktisk ikke nogen samlede funktioner i sig, så det er ikke nødvendigt at gruppere 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
Fejlen vises, fordi alle ikke-aggregerede kolonner skal defineres i GROUP BY
klausul, da dette definerer, hvordan de andre (samlede) kolonner beregnes. I dit tilfælde og givet det beskrevne problem, gætter jeg på bare at fjerne GROUP BY
vil løse dit 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
Rediger efter kommentar vedrørende duplikerede indlæg:
Følgende forespørgsel vil få den seneste post for hver 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
Dette er langt fra ideelt, men kunne bruges som en underforespørgsel til at vælge den relevante tekst som følger:
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
Jeg kan ikke lide at bruge underforespørgsler som denne, men jeg er en udvikler og ikke en DBA, og ovenstående er begrænset, så hvis der er elementer med identisk Chat_Relation_Id
og DateTime
så vil dubletter stadig forekomme. Der er sandsynligvis en smart måde at gøre det på ved at bruge en HAVING
Klausul
men forhåbentlig vil det hjælpe en anden med at løse dit problem, hvis dette ikke giver dig noget at arbejde ud fra.