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 iFROM
Klausul i enSELECT
udmelding. 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?