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

MySQL/MariaDB-サブクエリ内で並べ替え

    少し掘り下げた後、両方のシナリオを確認できます:

    MySQL5.1はORDER BYを適用します サブクエリ内。

    Linux上のMariaDB5.5.39はしません ORDER BYを適用します LIMITがない場合のサブクエリ内 供給されます。 します ただし、対応するLIMITの場合は、順序を正しく適用してください。 与えられる:

    SELECT t2.Code 
    FROM (
      SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
    ) AS t2;
    

    そのLIMITがないと 、サブクエリ内で並べ替えを適用する正当な理由はありません。同等に外部クエリに適用できます。

    文書化された動作:

    結局のところ、MariaDBはこの動作を文書化しています バグとは見なされません:

    「テーブル」(およびFROMのサブクエリ 句も)-SQL標準によると-順序付けされていない行のセットです。テーブル(またはFROMのサブクエリ)の行 条項)特定の順序ではありません。そのため、オプティマイザーはORDER BYを無視できます。 指定した句。実際、SQL標準ではORDER BYも許可されていません このサブクエリに表示される句(ORDER BY ... LIMITのため、許可します ...結果、行のセット、順序だけでなく変更します。

    FROMでサブクエリを処理する必要があります 句、不特定および未定義の順序の行のセットとして、ORDER BYを配置します トップレベルのSELECT

    そのため、MariaDBはORDER BYを適用することもお勧めします 最も外側のクエリ、またはLIMIT 必要に応じて。

    注:現在、適切なMySQL 5.5または5.6にアクセスして、動作が同じであるかどうかを確認できません(SQLFiddle.comが誤動作しています)。 元のバグレポートへのコメント (バグではないとしてクローズ)MySQL5.6はおそらくMariaDBと同じように動作することを示唆しています。



    1. SQLiteアップデート

    2. グループ関数を使用したデータの集約(oracleによるグループ化)

    3. SQL-各レコードのストアドプロシージャを呼び出す

    4. SSMSを使用してSQLServerエージェントジョブを作成する