sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:doorloop een tabelrij met for-lus, haal de kolomwaarde op op basis van de huidige rij

Je hebt hiervoor geen lus of zelfs een functie nodig.

Wat u wilt doen, kan worden gedaan in een enkele update-instructie, omdat het totale aantal per territorium kan worden berekend met een enkele aggregatie:

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

Dit kan dan worden gebruikt als bron om de territoriumtabel bij te werken:

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;

Een alternatief dat misschien gemakkelijker te begrijpen is, maar langzamer zal zijn voor grotere tabellen, is een update met een co-gerelateerde subquery

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

Er is een klein verschil tussen de eerste en tweede update:de tweede update de total_sales_person naar 0 (nul) voor die gebieden waar er helemaal geen verkoper is. De eerste zal alleen de telling bijwerken voor territoria die daadwerkelijk aanwezig zijn in de tabel met verkopers.




  1. Let op gebruikers die SQL Server 2008 en SQL Server 2008 R2 draaien

  2. Mysql verwijderen met subquery

  3. Hoe verwijder je automatisch alle referentierijen als de bovenliggende rij wordt verwijderd in mysql?

  4. Geen zoekopdrachtresultaten voor model [App\Products] Laravel