sql >> Base de Datos >  >> RDS >> Mysql

Bucle n veces sin usar un procedimiento almacenado

Documentos de MySQL sobre Declaraciones de control de flujo decir:

Documentos en Programas almacenados y vistas decir:

Sintaxis de declaraciones compuestas

Por lo tanto, parece que puede ejecutar un bucle explícito solo dentro de un procedimiento almacenado, una función o un disparador.

Dependiendo de lo que haga en su instrucción SQL, puede ser aceptable usar una tabla (o vista) de números (Creando una "Tabla de Números" en mysql , MYSQL:tabla de números secuenciales ).

Si su consulta es SELECT y está bien devolver el resultado de su SELECT 10 veces como un conjunto de resultados largo (en lugar de 10 conjuntos de resultados separados) puede hacer algo como esto:

SELECT MainQuery.*
FROM
    (
        SELECT 1 AS Number 
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
        UNION ALL SELECT 6
        UNION ALL SELECT 7
        UNION ALL SELECT 8
        UNION ALL SELECT 9
        UNION ALL SELECT 10
    ) AS Numbers
    CROSS JOIN
    (
        SELECT 'some data' AS Result
    ) AS MainQuery

Ejemplo para INSERTAR

Recomiendo tener una tabla permanente de números en su base de datos. Es útil en muchos casos. Consulte los enlaces anteriores sobre cómo generarlo.

Entonces, si tienes una tabla Numbers con int columna Number con valores de 1 a, digamos, 100K (como yo) y clave principal en esta columna, luego en lugar de este bucle:

DECLARE count INT DEFAULT 0;
WHILE count < 10 DO
    INSERT INTO table_name(col1,col2,col3) 
    VALUES("val1","val2",count);

    SET count = count + 1;
END WHILE;

puedes escribir:

INSERT INTO table_name(col1,col2,col3)
SELECT ("val1", "val2", Numbers.Number-1)
FROM Numbers
WHERE Numbers.Number <= 10;

También funcionaría casi 10 veces más rápido.