sql >> データベース >  >> RDS >> Sqlserver

Group By 句と Order By 句での SQL クエリ エラー

    GROUP BY を使用している場合 通常、集約関数 があります 、あなたが提供した SQL には実際には集計関数が含まれていないため、グループ化する必要はありません。

    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
      

    GROUP BY ですべての非集計列を定義する必要があるため、エラーがスローされています これは、他の (集計) 列の計算方法を定義するためです。あなたのインスタンスでは、説明されている問題を考えると、 GROUP BY を削除するだけだと思います あなたの問題を解決します。

    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
      

    重複エントリに関するコメントの後に編集:

    次のクエリは、各 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 
      

    これは理想とはほど遠いですが、次のように、関連するテキストを選択するためのサブクエリとして使用できます:

    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
      

    このようなサブクエリを使用するのは好きではありませんが、私は DBA ではなく開発者です。上記は、同じ Chat_Relation_Id を持つ項目がある場合に限られています。 および DateTime その後も重複が発生します。おそらく HAVING を使用してそれを行う賢い方法があります 条項 しかし、うまくいけば、これで何かを解決できない場合は、他の誰かがあなたの問題を解決するのに役立つでしょう.




    1. 動的テーブルの行データをデータベースに一度に挿入する方法

    2. テーブルを更新してから、mySQLで更新された行を返します

    3. オブジェクトタイプのネストされたテーブルを使用してOracleテーブルを作成するにはどうすればよいですか?

    4. doctrine2:データを失うことなく1対多から多対多に変換する方法