2013-10-02 21 views
32

Próbuję uzyskać 25 losowych próbek z 15 000 identyfikatorów ze stołu. Zamiast ręcznie naciskać za każdym razem, próbuję zrobić pętlę. W pełni rozumiem, że nie jest to optymalne wykorzystanie Postgreatora, ale jest to narzędzie, które mam. To, co mam tak daleko: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 

Odpowiedz

76

Procedural elements like loops nie są częścią języka SQL i mogą być używane tylko wewnątrz ciała funkcji języka proceduralnego lub DO oświadczenie, w którym takie dodatkowe elementy są zdefiniowane przez odpowiedni język proceduralny. Wartość domyślna to PL/pgSQL, ale there are others.

Przykład z 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$; 

Jeśli chcesz zoptymalizować wydajnośćrozważyć ten powiązane pytanie: