Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kesalahan Kueri SQL dalam Grup Berdasarkan dan Urutan Berdasarkan Klausa

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:Kegagalan tautan komunikasi Diperlukan SSL (gagal menerima paket)

  2. Permintaan sql DateTime sederhana

  3. Desain Skema untuk Faktur dan Pembayaran - model yang lebih baik daripada hubungan M:M?

  4. Cari Tahu Partisi Mana Nilai yang Diberikan Akan Dipetakan ke dalam SQL Server (T-SQL)

  5. Bagaimana saya bisa menjalankan hanya pernyataan kursor saya aktif di SQL Server Management Studio?