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_listEn liste over tabeludtryk, der tillader kolonner fra andre tabeller at blive vist i
WHEREtilstand og opdateringsudtrykkene. Dette svarer til listen over tabeller, der kan specificeres iFROMKlausul i enSELECTudmelding. Bemærk, at måltabellen ikke må vises ifrom_list, medmindre du har til hensigt at tilslutte dig selv (i så fald skal den vises med et alias ifrom_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?