sql >> Database teknologi >  >> RDS >> Sqlserver

SQL-forespørgselsfejl i gruppe efter og orden efter klausul

Når du bruger GROUP BY du vil normalt have samlede funktioner , den SQL, du har angivet, har faktisk ikke nogen samlede funktioner i sig, så det er ikke nødvendigt at gruppere 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

Fejlen vises, fordi alle ikke-aggregerede kolonner skal defineres i GROUP BY klausul, da dette definerer, hvordan de andre (samlede) kolonner beregnes. I dit tilfælde og givet det beskrevne problem, gætter jeg på bare at fjerne GROUP BY vil løse dit 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

Rediger efter kommentar vedrørende duplikerede indlæg:

Følgende forespørgsel vil få den seneste post for hver 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 
 

Dette er langt fra ideelt, men kunne bruges som en underforespørgsel til at vælge den relevante tekst som følger:

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
 

Jeg kan ikke lide at bruge underforespørgsler som denne, men jeg er en udvikler og ikke en DBA, og ovenstående er begrænset, så hvis der er elementer med identisk Chat_Relation_Id og DateTime så vil dubletter stadig forekomme. Der er sandsynligvis en smart måde at gøre det på ved at bruge en HAVING Klausul men forhåbentlig vil det hjælpe en anden med at løse dit problem, hvis dette ikke giver dig noget at arbejde ud fra.




  1. Maksimalt (anvendeligt) antal rækker i en Postgresql-tabel

  2. hvordan opretter man login-side i Android-appen?

  3. Docker, installer postgresql i en container indeholdende ubuntu:14.04, tabt, når den er ude af containeren

  4. Groovy Oracle Stored Proc - ugyldigt kolonneindeks