Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Loop n vezes sem usar um procedimento armazenado


Documentos do MySQL em Declarações de controle de fluxo dizer:

Documentos sobre Programas armazenados e visualizações dizer:

Sintaxe da declaração composta

Portanto, parece que você pode executar um loop explícito apenas dentro de um procedimento armazenado, função ou gatilho.

Dependendo do que você faz em sua instrução SQL, pode ser aceitável usar uma tabela (ou visualização) de números (Criando uma "Tabela de Números" no mysql , MYSQL:tabela de números sequenciais ).

Se sua consulta for um SELECT e não há problema em retornar o resultado do seu SELECT 10 vezes como um conjunto de resultados longo (em oposição a 10 conjuntos de resultados separados), você pode fazer algo assim:
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

Exemplo para INSERT

Eu recomendo ter uma tabela permanente de números em seu banco de dados. É útil em muitos casos. Veja nos links acima como gerá-lo.

Então, se você tem uma tabela Numbers com int coluna Number com valores de 1 a, digamos, 100K (como eu) e chave primária nesta coluna, em vez deste loop:
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;

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

Também funcionaria quase 10 vezes mais rápido.