sql >> Database teknologi >  >> RDS >> PostgreSQL

Opdater en kolonne i en tabel med en kolonne i en anden tabel i PostgreSQL

Din UPDATE forespørgslen skal se sådan ud:

UPDATE table2 t2
SET    val2 = t1.val1
FROM   table1 t1
WHERE  t2.table2_id = t1.table2_id
AND    t2.val2 IS DISTINCT FROM t1.val1;  -- optional, see below

Som du havde det, var der ingen forbindelse mellem individuelle rækker i de to tabeller. Hver række ville blive hentet fra table1 for hver række i table2 . Dette gav ingen mening (på en dyr måde) og udløste også syntaksfejlen, fordi et underforespørgselsudtryk på dette sted kun må returnere en enkelt værdi.

Jeg fiksede dette ved at forbinde de to tabeller på table2_id . Erstat det med det, der rent faktisk forbinder de to.

Jeg omskrev UPDATE for at deltage i table1 (med FROM klausul) i stedet for at køre korrelerede underforespørgsler, fordi det typisk er en størrelsesorden hurtigere.
Det forhindrer også, at table2.val2 ville blive annulleret, hvis der ikke findes nogen matchende række i table1 . I stedet intet sker med sådanne rækker med denne form for forespørgslen.

Du kan tilføje tabeludtryk til FROM liste ligesom ville i en almindelig SELECT (tabeller, underforespørgsler, sæt-returnerende funktioner, ...). Manualen:

from_list

En liste over tabeludtryk, der tillader kolonner fra andre tabeller at blive vist i WHERE tilstand og opdateringsudtrykkene. Dette svarer til listen over tabeller, der kan specificeres i FROM Klausul i en SELECT udmelding. Bemærk, at måltabellen ikke må vises i from_list , medmindre du har til hensigt at tilslutte dig selv (i så fald skal den vises med et alias i from_list ).

Den endelige WHERE klausul forhindrer opdateringer, der ikke ville ændre noget - hvilket praktisk talt altid er en god idé (næsten fuld pris, men ingen gevinst, eksotiske undtagelser gælder). Hvis både gammel og ny værdi er garanteret NOT NULL , forenkle til:

AND   t2.val2 <> t1.val1
  • Hvordan (eller kan jeg) VÆLGE DISTINCT på flere kolonner?


  1. Opdater rækker i én tabel med data fra en anden tabel baseret på, at én kolonne i hver er ens

  2. Hvad er en kandidatnøgle i databasedesign?

  3. Sådan fejlfindes disse 3 almindelige adgangsproblemer

  4. Hvordan deaktiverer jeg SQLAlchemy-caching?