sql >> Databáze >  >> RDS >> Sqlserver

Chyba dotazu SQL v klauzuli seskupit podle a seřadit podle

Když používáte GROUP BY normálně budete mít agregační funkce , SQL, který jste uvedli, v sobě ve skutečnosti nemá žádné agregační funkce, takže není nutné je seskupovat.

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

Chyba je vyvolána, protože všechny neagregované sloupce musí být definovány v GROUP BY klauzule, protože definuje způsob výpočtu ostatních (souhrnných) sloupců. Ve vašem případě a vzhledem k popsanému problému předpokládám, že pouze odstraním GROUP BY vyřeší váš problém.

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

Upravit po komentáři ohledně duplicitních záznamů:

Následující dotaz získá nejnovější záznam pro každý 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 

To není zdaleka ideální, ale lze jej použít jako dílčí dotaz pro výběr relevantního textu následovně:

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

Nerad používám poddotazy, jako je tento, ale jsem vývojář, nikoli DBA, a výše uvedené je omezeno tak, že pokud existují položky s identickým Chat_Relation_Id a DateTime pak se budou stále vyskytovat duplikáty. Pravděpodobně existuje chytrý způsob, jak to udělat pomocí HAVING doložka ale doufejme, že pokud vám to nedá nic k práci, pomůže to někomu jinému vyřešit váš problém.




  1. SQLAlchemy, PostgreSQL a array_agg:Jak vybrat položky z array_agg?

  2. Oracle vybrat chování aktualizace

  3. Vložit dotaz zkontrolovat, zda záznam existuje - Pokud ne, vložte jej

  4. mám výběr, který dělá 10 dotazů v doktríně (Symfony)