Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Lỗi truy vấn SQL trong mệnh đề theo nhóm và thứ tự

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để kết nối với cơ sở dữ liệu SQL từ C #?

  2. Sử dụng COL_LENGTH () để lấy độ dài của cột trong SQL Server

  3. Cách vô hiệu hóa tất cả các ràng buộc về CHECK &khóa ngoại trong cơ sở dữ liệu trong SQL Server (Ví dụ T-SQL)

  4. Cập nhật trường XML không có văn bản trong T-SQL

  5. Giới thiệu về bảng tạm thời trong SQL Server