PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL:Tabellenzeilen mit for-Schleife durchlaufen, Spaltenwert basierend auf aktueller Zeile abrufen

Sie brauchen dafür keine Schleife oder gar eine Funktion.

Was Sie tun möchten, kann in einer einzigen Aktualisierungsanweisung durchgeführt werden, da die Gesamtzahl pro Gebiet mit einer einzigen Aggregation berechnet werden kann:

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

Dies kann dann als Quelle zum Aktualisieren der Gebietstabelle verwendet werden:

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;

Eine Alternative, die möglicherweise einfacher zu verstehen ist, aber für größere Tabellen langsamer ist, ist ein Update mit einer zugehörigen Unterabfrage

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

Es gibt einen kleinen Unterschied zwischen dem ersten und dem zweiten Update:Das zweite aktualisiert die total_sales_person auf 0 (Null) für die Gebiete, in denen es überhaupt keinen Verkäufer gibt. Die erste aktualisiert nur die Anzahl der Gebiete, die tatsächlich in der Verkäufertabelle vorhanden sind.