Procedury elementy takie jak pętle nie są częścią języka SQL i mogą być używane tylko w treści funkcji języka proceduralnego, procedury (Postgres 11 lub nowszy) lub DO
oświadczenie, w którym takie dodatkowe elementy są określone przez odpowiedni język proceduralny. Domyślnie jest to PL/pgSQL, ale są też inne.
Przykład z plpgsql:
DO
$do$
BEGIN
FOR i IN 1..25 LOOP
INSERT INTO playtime.meta_random_sample
(col_i, col_id) -- declare target columns!
SELECT i, id
FROM tbl
ORDER BY random()
LIMIT 15000;
END LOOP;
END
$do$;
W przypadku wielu zadań, które można rozwiązać za pomocą pętli, istnieje krótsza i szybsza oparta na zestawach rozwiązanie za rogiem. Odpowiednik czystego SQL dla twojego przykładu:
INSERT INTO playtime.meta_random_sample (col_i, col_id)
SELECT t.*
FROM generate_series(1,25) i
CROSS JOIN LATERAL (
SELECT i, id
FROM tbl
ORDER BY random()
LIMIT 15000
) t;
O generate_series()
:
- Jakie jest oczekiwane zachowanie wielu funkcji zwracających zestaw w klauzuli SELECT?
O optymalizacji wydajności losowych wyborów:
- Najlepszy sposób na wybieranie losowych wierszy PostgreSQL