PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zaktualizuj kolumnę tabeli o kolumnę innej tabeli w PostgreSQL

Twoja UPDATE zapytanie powinno wyglądać tak:

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

Tak jak to zrobiłeś, nie było połączenia między poszczególnymi rzędami dwóch tabel. Każdy wiersz zostałby pobrany z table1 dla każdego wiersza w table2 . To nie miało sensu (w drogi sposób), a także powodowało błąd składni, ponieważ wyrażenie podzapytania w tym miejscu może zwrócić tylko jedną wartość.

Naprawiłem to, łącząc dwie tabele na table2_id . Zastąp to tym, co faktycznie łączy te dwie rzeczy.

Przepisałem UPDATE dołączyć do table1 (z FROM klauzuli) zamiast uruchamiania skorelowanych podzapytań, ponieważ jest to zazwyczaj szybsze o rząd wielkości.
Zapobiega to również temu table2.val2 zostanie unieważniony, gdy nie zostanie znaleziony pasujący wiersz w table1 . Zamiast tego nic dzieje się z takimi wierszami w tej formie zapytania.

Możesz dodać wyrażenia tabelowe do FROM lista jak w zwykłym SELECT (tabele, podzapytania, funkcje zwracania zestawu, ...). Instrukcja:

from_list

Lista wyrażeń tabel, umożliwiająca wyświetlanie kolumn z innych tabel w WHERE warunek i wyrażenia aktualizacji. Jest to podobne do listy tabel, które można określić w FROM Klauzula SELECT oświadczenie. Pamiętaj, że tabela docelowa nie może pojawić się na from_list , chyba że zamierzasz samodołączyć (w takim przypadku musi pojawić się z aliasem w from_list ).

Ostatnie WHERE klauzula zapobiega aktualizacjom, które niczego nie zmienią - co praktycznie zawsze jest dobrym pomysłem (prawie pełny koszt, ale bez zysku, obowiązują egzotyczne wyjątki). Jeśli zarówno stara, jak i nowa wartość są gwarantowane jako NOT NULL , uprość do:

AND   t2.val2 <> t1.val1
  • Jak (lub mogę) WYBRAĆ ODRÓŻNIENIE w wielu kolumnach?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Heroku Postgres Error:PGError:ERROR:organizacje relacyjne nie istnieją (ActiveRecord::StatementInvalid)

  2. Planeta PostgreSQL w galaktyce Ansible

  3. Dodaj kolumnę sygnatury czasowej z domyślną funkcją NOW() tylko dla nowych wierszy

  4. Jak połączyć się ze zdalną bazą danych PostgreSQL przez SSL za pomocą Pythona?

  5. Oracle odpowiednik Postgresa DISTINCT ON?