Když používáte GROUP BY
normálně budete mít agregační funkce
, SQL, který jste uvedli, v sobě ve skutečnosti nemá žádné agregační funkce, takže není nutné je seskupovat.
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
Chyba je vyvolána, protože všechny neagregované sloupce musí být definovány v GROUP BY
klauzule, protože definuje způsob výpočtu ostatních (souhrnných) sloupců. Ve vašem případě a vzhledem k popsanému problému předpokládám, že pouze odstraním GROUP BY
vyřeší váš problém.
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
Upravit po komentáři ohledně duplicitních záznamů:
Následující dotaz získá nejnovější záznam pro každý 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
To není zdaleka ideální, ale lze jej použít jako dílčí dotaz pro výběr relevantního textu následovně:
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
Nerad používám poddotazy, jako je tento, ale jsem vývojář, nikoli DBA, a výše uvedené je omezeno tak, že pokud existují položky s identickým Chat_Relation_Id
a DateTime
pak se budou stále vyskytovat duplikáty. Pravděpodobně existuje chytrý způsob, jak to udělat pomocí HAVING
doložka
ale doufejme, že pokud vám to nedá nic k práci, pomůže to někomu jinému vyřešit váš problém.