2013-10-02 21 views
32

Sto cercando di ottenere 25 campioni casuali di 15.000 ID da un tavolo. Invece di premere manualmente la corsa ogni volta, sto provando a fare un ciclo. Che capisco perfettamente non è l'uso ottimale di Postgres, ma è lo strumento che ho. Questo è quello che ho finora:Postgres FOR LOOP

for i in 1..25 LOOP 
    insert into playtime.meta_random_sample 
    select i, ID 
    from tbl 
    order by random() limit 15000 
end loop 

risposta

76

Procedural elements like loops non fanno parte del linguaggio SQL e possono essere utilizzati solo all'interno del corpo di una funzione di linguaggio procedurale o di una dichiarazione DO, in cui tali elementi aggiuntivi sono definiti da il rispettivo linguaggio procedurale. L'impostazione predefinita è PL/pgSQL, ma there are others.

Esempio con plpgsql:

DO 
$do$ 
BEGIN 
FOR i IN 1..25 LOOP 
    INSERT INTO playtime.meta_random_sample (col_i, col_id) -- use col names 
    SELECT i, id 
    FROM tbl 
    ORDER BY random() 
    LIMIT 15000; 
END LOOP; 
END 
$do$; 

Se è necessario ottimizzare le prestazioni , considerano questa domanda correlata: