sql >> Base de Datos >  >> RDS >> Sqlserver

Error de consulta SQL en la cláusula Agrupar por y Ordenar por

Cuando estás usando GROUP BY normalmente tendrá funciones agregadas , el SQL que proporcionó en realidad no tiene ninguna función agregada, por lo que no es necesario agruparlo.

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

El error se produce porque todas las columnas no agregadas deben definirse en GROUP BY ya que esto define cómo se calculan las otras columnas (agregadas). En su caso y dado el problema descrito, supongo que simplemente eliminando el GROUP BY resolverá su problema.

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

Editar después del comentario sobre entradas duplicadas:

La siguiente consulta obtendrá la entrada más reciente para cada 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 

Esto está lejos de ser ideal, pero podría usarse como una subconsulta para seleccionar el texto relevante de la siguiente manera:

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

No me gusta usar subconsultas como esta, pero soy un desarrollador, no un DBA, y lo anterior está limitado de tal manera que si hay elementos con Chat_Relation_Id idénticos y DateTime entonces todavía se producirán duplicados. Probablemente haya una forma inteligente de hacerlo utilizando un HAVING Cláusula pero con suerte, si esto no le da algo para trabajar, ayudará a otra persona a resolver su problema.