Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Грешка в SQL заявката в клауза Групиране по и Подреждане по

Когато използвате GROUP BY обикновено ще имате агрегирани функции , предоставеният от вас SQL всъщност няма никакви агрегатни функции в него, така че няма нужда да бъде групиран.

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

Грешката се хвърля, защото всички неагрегирани колони трябва да бъдат дефинирани в GROUP BY клауза, тъй като това дефинира как се изчисляват другите (обобщени) колони. Във вашия случай и предвид описания проблем, предполагам, че просто премахвам GROUP BY ще разреши проблема ви.

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

Редактиране след коментар относно дублиращи се записи:

Следната заявка ще получи най-новия запис за всеки 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 

Това далеч не е идеално, но може да се използва като подзаявка за избор на съответния текст, както следва:

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

Не обичам да използвам подзаявки като тази, но аз съм разработчик, а не DBA, и горното е ограничено, така че ако има елементи с идентичен Chat_Relation_Id и DateTime тогава дубликатите все още ще се появяват. Вероятно има умен начин да го направите с помощта на HAVING Клауза но се надяваме, че ако това не ви даде нещо, от което да работите, ще помогне на някой друг да разреши проблема ви.




  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 география към dbgeography?

  2. Защо преобразуването от DATETIME в DATETIME2 изглежда променя стойността?

  3. Съхраняване на съобщението за рейзрор на SqlServer в C#

  4. Грешка:Типът на колоната DOB е в конфликт с типа на други колони, посочени в списъка UNPIVOT

  5. Проактивни проверки на състоянието на SQL Server, част 1:Дисково пространство