Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Schleife n-mal, ohne eine gespeicherte Prozedur zu verwenden

MySQL-Dokumentation zu Flow Control Statements sagen:

Dokumente zu Gespeicherte Programme und Ansichten sagen:

Compound-Statement-Syntax

Es sieht also so aus, als könnten Sie eine explizite Schleife nur innerhalb einer gespeicherten Prozedur, Funktion oder eines Triggers ausführen.

Je nachdem, was Sie in Ihrer SQL-Anweisung tun, kann es akzeptabel sein, eine Tabelle (oder Ansicht) mit Zahlen zu verwenden (Eine "Zahlentabelle" in mysql erstellen , MYSQL:Sequenzielle Nummerntabelle ).

Wenn Ihre Abfrage ein SELECT ist und es ist in Ordnung, das Ergebnis Ihres SELECT zurückzugeben 10 Mal als eine lange Ergebnismenge (im Gegensatz zu 10 separaten Ergebnismengen) können Sie etwa so vorgehen:

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

Beispiel für INSERT

Ich empfehle, eine feste Zahlentabelle in Ihrer Datenbank zu haben. Es ist in vielen Fällen nützlich. Sehen Sie sich die obigen Links an, um es zu generieren.

Wenn Sie also eine Tabelle Numbers haben mit int Spalte Number mit Werten von 1 bis, sagen wir, 100K (wie ich es tue) und Primärschlüssel auf dieser Spalte, dann statt dieser Schleife:

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;

Sie können schreiben:

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

Es würde auch fast 10-mal schneller funktionieren.