Вашата UPDATE
заявката трябва да изглежда така:
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
По начина, по който го имахте, нямаше връзка между отделните редове на двете таблици. Всеки ред ще бъде извлечен от table1
за всеки ред в table2
. Това нямаше смисъл (по скъп начин) и също така задейства синтактична грешка, тъй като израз на подзаявка на това място е разрешен да връща само една стойност.
Поправих това, като съединих двете таблици на table2_id
. Заменете това с всичко, което всъщност свързва двете.
Пренаписах UPDATE
за да се присъедините към table1
(с FROM
клауза) вместо да изпълнява корелирани подзаявки, тъй като това обикновено е по-бързо с порядък.
То също така предотвратява това table2.val2
ще бъде анулиран, когато не е намерен съвпадащ ред в table1
. Вместо това нищо се случва с такива редове с тази форма на заявката.
Можете да добавите таблични изрази към FROM
списък като в обикновен SELECT
(таблици, подзаявки, функции за връщане на набори, ...). Ръководството:
from_list
Списък с изрази на таблици, позволяващ колони от други таблици да се показват в
WHERE
условие и изразите за актуализиране. Това е подобно на списъка с таблици, които могат да бъдат посочени вFROM
Клауза наSELECT
изявление. Имайте предвид, че целевата таблица не трябва да се показва вfrom_list
, освен ако не възнамерявате да се присъедините самостоятелно (в този случай то трябва да се появи с псевдоним вfrom_list
).
Последният WHERE
Клаузата предотвратява актуализации, които не биха променили нищо - което на практика винаги е добра идея (почти пълна цена, но без печалба, прилагат се екзотични изключения). Ако и старата, и новата стойност са гарантирани, че са NOT NULL
, опростете до:
AND t2.val2 <> t1.val1
- Как да (или мога) да ИЗБЕРЯ DISTINCT за няколко колони?