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.