Wenn Sie GROUP BY verwenden Sie haben normalerweise Aggregatfunktionen
, enthält die von Ihnen bereitgestellte SQL keine Aggregatfunktionen, sodass sie nicht gruppiert werden muss.
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
Der Fehler wird ausgelöst, weil alle nicht aggregierten Spalten in GROUP BY definiert werden müssen -Klausel, da diese definiert, wie die anderen (aggregierten) Spalten berechnet werden. In Ihrem Fall und angesichts des beschriebenen Problems nehme ich an, dass Sie einfach GROUP BY entfernen wird Ihr Problem lösen.
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
Nach Kommentar zu doppelten Einträgen bearbeiten:
Die folgende Abfrage ruft den neuesten Eintrag für jede Chat_Relation_Id ab
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
Dies ist alles andere als ideal, könnte aber als Unterabfrage verwendet werden, um den relevanten Text wie folgt auszuwählen:
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
Ich mag es nicht, Unterabfragen wie diese zu verwenden, aber ich bin ein Entwickler, kein DBA, und das Obige ist so eingeschränkt, dass es Elemente mit identischer Chat_Relation_Id gibt und DateTime dann treten immer noch Duplikate auf. Es gibt wahrscheinlich einen cleveren Weg, dies mit einem HAVING zu tun Klausel
Aber hoffentlich hilft es jemand anderem, Ihr Problem zu lösen, wenn es Ihnen nichts bringt, womit Sie arbeiten können.