Procedurale elementi come loop non fanno parte del linguaggio SQL e possono essere utilizzati solo all'interno del corpo di una funzione del linguaggio procedurale, una procedura (Postgres 11 o successivo) o un DO
dichiarazione, laddove tali elementi aggiuntivi siano definiti dal rispettivo linguaggio procedurale. L'impostazione predefinita è PL/pgSQL, ma ce ne sono altri.
Esempio con 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$;
Per molte attività che possono essere risolte con un ciclo, esiste un set-based più breve e veloce soluzione dietro l'angolo. Equivalente SQL puro per il tuo esempio:
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;
Informazioni su generate_series()
:
- Qual è il comportamento previsto per più funzioni di restituzione di set nella clausola SELECT?
Informazioni sull'ottimizzazione delle prestazioni delle selezioni casuali:
- Il modo migliore per selezionare righe casuali PostgreSQL