sql >> Databasteknik >  >> RDS >> Mysql

Slinga n gånger utan att använda en lagrad procedur

MySQL-dokument på Flödeskontrolluttalanden säg:

Dokument på Lagrade program och vyer säg:

Compound-Statement Syntax

Så det ser ut som att du bara kan köra en explicit loop inom en lagrad procedur, funktion eller trigger.

Beroende på vad du gör i din SQL-sats kan det vara acceptabelt att använda en tabell (eller vy) med tal (Skapa en "Numbers Table" i mysql , MYSQL:Sequential Number Table ).

Om din fråga är en SELECT och det är OK att returnera resultatet av din SELECT 10 gånger som en lång resultatuppsättning (i motsats till 10 separata resultatuppsättningar) kan du göra något så här:

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

Exempel för INSERT

Jag rekommenderar att du har en permanent tabell med nummer i din databas. Det är användbart i många fall. Se länkarna ovan hur du genererar det.

Så om du har en tabell Numbers med int kolumn Numbers med värden från 1 till, säg, 100K (som jag gör), och primärnyckel i denna kolumn, istället för denna 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;

du kan skriva:

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

Det skulle också fungera nästan 10 gånger snabbare.



  1. 3 sätt att få språket för den aktuella sessionen i SQL Server (T-SQL)

  2. Hur väljer man den sista posten i en tabell i SQL?

  3. MySql:Visa kolumner men exkludera allt utom fältnamnen

  4. Välj första raden i varje grupp i sql