PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Актуализирайте колона на таблица с колона на друга таблица в PostgreSQL

Вашата 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 за да се присъедините към table1FROM клауза) вместо да изпълнява корелирани подзаявки, тъй като това обикновено е по-бързо с порядък.
То също така предотвратява това table2.val2 ще бъде анулиран, когато не е намерен съвпадащ ред в table1 . Вместо това нищо се случва с такива редове с тази форма на заявката.

Можете да добавите таблични изрази към FROM списък като в обикновен SELECT (таблици, подзаявки, функции за връщане на набори, ...). Ръководството:

from_list

Списък с изрази на таблици, позволяващ колони от други таблици да се показват в WHERE условие и изразите за актуализиране. Това е подобно на списъка с таблици, които могат да бъдат посочени в FROM Клауза на SELECT изявление. Имайте предвид, че целевата таблица не трябва да се показва в from_list , освен ако не възнамерявате да се присъедините самостоятелно (в този случай то трябва да се появи с псевдоним в from_list ).

Последният WHERE Клаузата предотвратява актуализации, които не биха променили нищо - което на практика винаги е добра идея (почти пълна цена, но без печалба, прилагат се екзотични изключения). Ако и старата, и новата стойност са гарантирани, че са NOT NULL , опростете до:

AND   t2.val2 <> t1.val1
  • Как да (или мога) да ИЗБЕРЯ DISTINCT за няколко колони?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL процедурния език C не е намерен

  2. PGError:ГРЕШКА:агрегатите не са разрешени в клаузата WHERE на AR заявка на обект и неговите has_many обекти

  3. PostgreSQL date() с часова зона

  4. Как Cosh() работи в PostgreSQL

  5. Кога да използваме наследени таблици в PostgreSQL?