Zaktualizuj kolumnę danymi z innej tabeli

11

Pracuję nad skomplikowanym problemem, ale uproszczę go do tego problemu.

Mam dwa stoliki

A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]

i chcę zaktualizować trzeci:

C [ID, column1, column2,column3] 

Aktualizuję kolejną trzecią tabelę za pomocą tego zapytania.

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A, B limit 1; ) as t ; 

Mam:

UPDATE 0

Po uruchomieniu tego zapytania:

select A.column1 as firstTab, B.column2 as secTab, (A.column1 + B.column2) thirdTab 
            from A, B limit 1; 

Mam wyniki. Czy coś brakuje?

Przykładowe dane: http://sqlfiddle.com/#!15/e4d08/5

użytkownik3001937
źródło

Odpowiedzi:

19

Prawidłowa forma to (przy założeniu, że brak jest informacji o wersji pg 9.3):

UPDATE C 
SET    column1 = A.column1 
     , column2 = B.column2 
     , column3 = A.column1 + B.column2
FROM   A
JOIN   B ON A.id = B.id  -- ??? not specified in question!
WHERE  C.id = A.id      --  ??? not specified in question!
AND   (C.column1, C.column2, C.column3) IS DISTINCT FROM
      (A.column1, B.column2, A.column1 + B.column2);

Ostatnia WHEREklauzula jest opcjonalna, aby uniknąć pustych aktualizacji, które niczego nie zmieniłyby (ale nadal piszą nową wersję wiersza po pełnym koszcie).

ypercube podał już podstawowe wyjaśnienie w swoim komentarzu:

Nie dostajesz duplikacji. Tabela pochodna jest łączeniem krzyżowym Ai B(tj. Bez żadnych warunków łączenia ), a następnie wybieraniem dowolnego wiersza ( LIMIT 1bez ORDER BY). Następnie używa wartości z tego dowolnego wiersza, aby zaktualizować wszystkie wiersze tabeli C. Jeśli chcesz używać różnych wartości dla różnych wierszy C, musisz połączyć 3 tabele (używając JOIN - ONi WHERE)

Szczegółowe informacje można znaleźć w instrukcji obsługi UPDATE.

Erwin Brandstetter
źródło
0

musisz zrobić coś takiego:

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A
        join B  on ...
        where ... ) as t
dimitar
źródło