Wanneer u GROUP BY
. gebruikt normaal gesproken heb je geaggregeerde functies
, bevat de SQL die u heeft opgegeven eigenlijk geen geaggregeerde functies, dus het is niet nodig om deze te groeperen.
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
De fout wordt gegenereerd omdat alle niet-geaggregeerde kolommen moeten worden gedefinieerd in de GROUP BY
clausule, aangezien dit definieert hoe de andere (geaggregeerde) kolommen worden berekend. In jouw geval en gezien het beschreven probleem, vermoed ik dat ik gewoon de GROUP BY
. verwijder zal uw probleem oplossen.
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
Bewerken na opmerking over dubbele inzendingen:
De volgende zoekopdracht levert de meest recente invoer op voor elke 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
Dit is verre van ideaal, maar kan als een subquery worden gebruikt om de relevante tekst als volgt te selecteren:
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
Ik hou er niet van om dit soort subquery's te gebruiken, maar ik ben een ontwikkelaar en geen DBA, en het bovenstaande is zo beperkt dat als er items zijn met identieke Chat_Relation_Id
en DateTime
dan zullen er nog steeds duplicaten voorkomen. Er is waarschijnlijk een slimme manier om dit te doen met een HAVING
Clausule
maar hopelijk als dit je niet iets geeft om van te werken, zal het iemand anders helpen je probleem op te lossen.