Saat Anda menggunakan GROUP BY
Anda biasanya akan memiliki fungsi gabungan
, SQL yang Anda berikan sebenarnya tidak memiliki fungsi agregat di dalamnya sehingga tidak perlu dikelompokkan.
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
Kesalahan terjadi karena semua kolom non agregat harus didefinisikan dalam GROUP BY
klausa karena ini mendefinisikan bagaimana kolom (agregat) lainnya dihitung. Dalam contoh Anda dan mengingat masalah yang dijelaskan, saya kira hanya menghapus GROUP BY
akan menyelesaikan masalah Anda.
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
Edit setelah komentar mengenai entri duplikat:
Kueri berikut akan mendapatkan entri terbaru untuk setiap 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
Ini jauh dari ideal, tetapi dapat digunakan sebagai sub kueri untuk memilih teks yang relevan sebagai berikut:
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
Saya tidak suka menggunakan sub-query seperti ini tetapi saya seorang pengembang bukan DBA, dan di atas dibatasi sedemikian rupa sehingga jika ada item dengan Chat_Relation_Id
yang identik dan DateTime
maka duplikat masih akan terjadi. Mungkin ada cara cerdas untuk melakukannya menggunakan HAVING
Klausa
tetapi semoga jika ini tidak memberi Anda sesuatu untuk dikerjakan, ini akan membantu orang lain menyelesaikan masalah Anda.