Khi bạn đang sử dụng GROUP BY
thông thường bạn sẽ có chức năng tổng hợp
, SQL mà bạn đã cung cấp thực sự không có bất kỳ hàm tổng hợp nào trong đó nên không cần nhóm nó.
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
Lỗi đang xảy ra vì tất cả các cột không tổng hợp phải được xác định trong GROUP BY
mệnh đề này xác định cách tính các cột (tổng hợp) khác. Trong trường hợp của bạn và với sự cố được mô tả, tôi đoán chỉ xóa GROUP BY
sẽ giải quyết vấn đề của bạn.
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
Chỉnh sửa sau khi nhận xét về các mục nhập trùng lặp:
Truy vấn sau sẽ nhận được mục nhập gần đây nhất cho mỗi 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
Điều này là không lý tưởng, nhưng có thể được sử dụng như một truy vấn phụ để chọn văn bản có liên quan như sau:
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
Tôi không thích sử dụng các truy vấn phụ như thế này nhưng tôi là nhà phát triển không phải là DBA và những điều trên bị hạn chế để nếu có các mục có Chat_Relation_Id
giống hệt nhau và DateTime
thì các bản sao vẫn sẽ xảy ra. Có thể có một cách thông minh để làm điều đó bằng cách sử dụng HAVING
Mệnh đề
nhưng hy vọng nếu điều này không mang lại cho bạn điều gì đó để làm việc thì nó sẽ giúp người khác giải quyết vấn đề của bạn.