Kiedy używasz GROUP BY
zwykle będziesz mieć funkcje agregujące
, podany kod SQL nie zawiera w rzeczywistości żadnych funkcji agregujących, więc nie ma potrzeby grupowania go.
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
Błąd jest generowany, ponieważ wszystkie kolumny nieagregujące muszą być zdefiniowane w GROUP BY
klauzula, ponieważ definiuje sposób obliczania innych (zagregowanych) kolumn. W twoim przypadku i biorąc pod uwagę opisany problem, zgaduję, że po prostu usuwam GROUP BY
rozwiąże Twój problem.
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
Edytuj po komentarzu dotyczącym zduplikowanych wpisów:
Następujące zapytanie otrzyma najnowszy wpis dla każdego 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
Jest to dalekie od ideału, ale może być użyte jako podzapytanie do wybrania odpowiedniego tekstu w następujący sposób:
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
Nie lubię używać takich podzapytań, ale jestem programistą, a nie DBA, a powyższe jest ograniczone tak, że jeśli istnieją elementy o identycznym Chat_Relation_Id
i DateTime
wtedy duplikaty nadal będą występować. Prawdopodobnie istnieje sprytny sposób na zrobienie tego za pomocą HAVING
Klauzula
ale miejmy nadzieję, że jeśli to nie da ci czegoś do pracy, pomoże to komuś innemu rozwiązać twój problem.