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

MySQL 5.7 /8.0とMySQL5.6で繰り返し選択されるたびに、サブクエリのrand()列が再評価されました

    MySQL8.0.0マイルストーンリリースで述べたように利用可能です

    これが、新しいバージョンのMySQLで観察されている動作の原因であると思います。前述のヒントをMySQL 8.0で使用すると、RAND()を1回だけ呼び出すことができます。

    SELECT  /* NO_MERGE(q) */
            q.i,
            q.r,
            q.r
    FROM    (
            SELECT 
                    id AS i,
                    (FLOOR(RAND(100) * 4)) AS r
            FROM t
            ) AS q;
    
    +---+-----+-----+
    | i |  r  |  r  |
    +---+-----+-----+
    | 1 |   0 |   0 |
    | 2 |   2 |   2 |
    | 3 |   3 |   3 |
    | 4 |   2 |   2 |
    | 5 |   1 |   1 |
    +---+-----+-----+
    

    ただし、これは5.7では使用できません。 5.7で目的の動作を実現するには、LIMIT <a very high number>を追加します。 派生テーブル定義に(以下で署名されたLONG_MAXを使用しています)。この回避策 を提供してくれたRoyLysengに感謝します。 。

    SELECT
            q.i,
            q.r,
            q.r
    FROM    (
            SELECT 
                    id AS i,
                    (FLOOR(RAND(100) * 4)) AS r
            FROM t LIMIT 9223372036854775807
            ) AS q;
    
    +---+-----+-----+
    | i |  r  |  r  |
    +---+-----+-----+
    | 1 |   0 |   0 |
    | 2 |   2 |   2 |
    | 3 |   3 |   3 |
    | 4 |   2 |   2 |
    | 5 |   1 |   1 |
    +---+-----+-----+
    

    philipxyとして コメントで言及されているように、クエリ式の結果は、適用されている最適化に関係なく厳密に定義する必要があります。これは、MySQL 5.7/8.0のオプティマイザのバグであることを意味します。




    1. PostgreSQLデータベースを復元する際の特権の問題を解決する方法

    2. 下部にヌルがあるASCによる注文

    3. SQLServerテーブルの既存の列にデフォルトの制約を追加する方法-SQLServer/TSQLチュートリアルパート91

    4. サブクエリでのGROUP_CONCATの奇妙な結果