sql >> Database >  >> RDS >> Sqlserver

SQL-queryfout in groep op en op volgorde van clausule

Wanneer u GROUP BY . gebruikt normaal gesproken heb je geaggregeerde functies , bevat de SQL die u heeft opgegeven eigenlijk geen geaggregeerde functies, dus het is niet nodig om deze te groeperen.

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

De fout wordt gegenereerd omdat alle niet-geaggregeerde kolommen moeten worden gedefinieerd in de GROUP BY clausule, aangezien dit definieert hoe de andere (geaggregeerde) kolommen worden berekend. In jouw geval en gezien het beschreven probleem, vermoed ik dat ik gewoon de GROUP BY . verwijder zal uw probleem oplossen.

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

Bewerken na opmerking over dubbele inzendingen:

De volgende zoekopdracht levert de meest recente invoer op voor elke 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 

Dit is verre van ideaal, maar kan als een subquery worden gebruikt om de relevante tekst als volgt te selecteren:

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

Ik hou er niet van om dit soort subquery's te gebruiken, maar ik ben een ontwikkelaar en geen DBA, en het bovenstaande is zo beperkt dat als er items zijn met identieke Chat_Relation_Id en DateTime dan zullen er nog steeds duplicaten voorkomen. Er is waarschijnlijk een slimme manier om dit te doen met een HAVING Clausule maar hopelijk als dit je niet iets geeft om van te werken, zal het iemand anders helpen je probleem op te lossen.




  1. Hoe de schemanaam en tabelnaam als invoer door te geven en vervolgens de geheugengrootte en het aantal rijen als uitvoer in plsql te krijgen

  2. Een PostgreSQL-database opzetten in Django

  3. Kan Arabisch niet opslaan in MYSQL-database met behulp van PHP

  4. OP DUPLICATE KEY UPDATE met WHERE voorwaarde