sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Query-fel i Group By och Order By-klausul

När du använder GROUP BY du kommer normalt att ha samlade funktioner , SQL-koden du angav har faktiskt inga samlade funktioner i sig så det finns inget behov av att gruppera den.

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

Felet skapas eftersom alla icke aggregerade kolumner måste definieras i GROUP BY sats eftersom denna definierar hur de andra (sammanlagda) kolumnerna beräknas. I ditt fall och med tanke på problemet som beskrivs, gissar jag att du bara tar bort GROUP BY kommer att lösa ditt 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

Redigera efter kommentar angående dubblerade poster:

Följande fråga kommer att få den senaste posten för varje 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 

Detta är långt ifrån idealiskt, men kan användas som en underfråga för att välja relevant text enligt följande:

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

Jag gillar inte att använda underfrågor som denna, men jag är en utvecklare inte en DBA, och ovanstående är begränsat så att om det finns objekt med identiskt Chat_Relation_Id och DateTime då kommer dubbletter fortfarande att förekomma. Det finns förmodligen ett smart sätt att göra det med en HAVING Klausul men förhoppningsvis kommer det att hjälpa någon annan att lösa ditt problem om detta inte ger dig något att arbeta utifrån.




  1. Viloläge sökfråga

  2. Praktisk gräns för SQL-frågans längd (särskilt MySQL)

  3. 2019 PostgreSQL-trendrapport:Privat vs. Public Cloud, Migrations, Database Combinations &Top Reasones Used

  4. Skickar databasanslutning genom referens i PHP