Когато използвате GROUP BY
обикновено ще имате агрегирани функции
, предоставеният от вас SQL всъщност няма никакви агрегатни функции в него, така че няма нужда да бъде групиран.
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
Грешката се хвърля, защото всички неагрегирани колони трябва да бъдат дефинирани в GROUP BY
клауза, тъй като това дефинира как се изчисляват другите (обобщени) колони. Във вашия случай и предвид описания проблем, предполагам, че просто премахвам GROUP BY
ще разреши проблема ви.
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
Редактиране след коментар относно дублиращи се записи:
Следната заявка ще получи най-новия запис за всеки 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
Това далеч не е идеално, но може да се използва като подзаявка за избор на съответния текст, както следва:
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
Не обичам да използвам подзаявки като тази, но аз съм разработчик, а не DBA, и горното е ограничено, така че ако има елементи с идентичен Chat_Relation_Id
и DateTime
тогава дубликатите все още ще се появяват. Вероятно има умен начин да го направите с помощта на HAVING
Клауза
но се надяваме, че ако това не ви даде нещо, от което да работите, ще помогне на някой друг да разреши проблема ви.