sql >> Databáze >  >> RDS >> Mysql

Sloupec rand() poddotazu byl znovu vyhodnocen pro každý opakovaný výběr v MySQL 5.7/8.0 vs MySQL 5.6

Jak je uvedeno v Vydání MySQL 8.0.0 Milestone je k dispozici ,

Předpokládám, že toto je příčina chování, které pozoruji v novějších verzích MySQL. Uvedenou nápovědu lze použít s MySQL 8.0 k vynucení volání RAND() pouze jednou:

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 |
+---+-----+-----+

To však není k dispozici v 5.7. Chcete-li dosáhnout požadovaného chování s 5.7, přidejte LIMIT <a very high number> na odvozenou definici tabulky (níže používám podepsané LONG_MAX). Děkujeme Royi Lysengovi za toto řešení .

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 |
+---+-----+-----+

Jako philipxy Jak je uvedeno v komentáři, výsledek dotazového výrazu musí být přesně definován bez ohledu na jakékoli použité optimalizace. Což znamená, že jde o chybu optimalizátoru v MySQL 5.7/8.0.




  1. IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY v SQL Server:Jaký je rozdíl?

  2. Žádná podpora pro OVER v MS SQL Server 2005?

  3. Jak odstranit výchozí hodnotu sloupce v MySQL

  4. Oracle - aktualizace join - tabulka bez klíčů