PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL :parcourir les lignes d'une table avec une boucle for, récupérer la valeur de la colonne en fonction de la ligne actuelle

Vous n'avez pas besoin d'une boucle ou même d'une fonction pour cela.

Ce que vous voulez faire peut être fait dans une seule déclaration de mise à jour, car le nombre total par territoire peut être calculé avec une seule agrégation :

SELECT salesterritoryid, count(*) as total_count
FROM salesperson_t
group by salesterritoryid

Cela peut ensuite être utilisé comme source pour mettre à jour la table des territoires :

UPDATE territory2_t
   SET total_sales_person = t.total_count
FROM (
   SELECT salesterritoryid, count(*) as total_count
   FROM salesperson_t
   group by salesterritoryid
) t 
WHERE territoryid = t.salesterritoryid;

Une alternative qui pourrait être plus facile à comprendre mais qui sera plus lente pour les grandes tables est une mise à jour avec une sous-requête co-liée

UPDATE territory2_t tg
   SET total_sales_person = (select count(*) 
                             from salesperson_t sp
                             where sp.salesterritoryid = tg.territoryid);

Il y a une légère différence entre la première et la deuxième mise à jour :la seconde mettra à jour le total_sales_person à 0 (zéro) pour les territoires où il n'y a aucun vendeur. Le premier ne mettra à jour que le décompte des territoires réellement présents dans la table des vendeurs.