Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Błąd zapytania SQL w Grupuj według i porządkuj według klauzuli

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PARSE() vs CAST() vs CONVERT() w SQL Server:jaka jest różnica?

  2. Podstawy zarządzania plikami danych w SQL Server

  3. Jak włączyć wszystkie ograniczenia wyboru i klucza obcego w bazie danych w programie SQL Server (przykłady T-SQL)

  4. Jak mogę dołączyć moje dane do kalendarza, aby uzyskać rekord dla każdego dnia od początku do końca w SQL Server?

  5. Jak wyświetlić parametry aktualnie uruchomionych procesów w SQL Server 2008?