Оновіть стовпчик даними з іншої таблиці


11

Я працюю над складною проблемою, але спрощу її до цієї проблеми.

У мене дві таблиці

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

і я хочу оновити третю:

C [ID, column1, column2,column3] 

Я оновлюю ще одну третю таблицю за допомогою цього запиту.

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 ; 

Я зрозумів, я отримав:

UPDATE 0

Коли я запускаю цей запит:

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

Я отримав результати. Я щось пропускаю?

Приклад даних: http://sqlfiddle.com/#!15/e4d08/5

Відповіді:


19

Належною формою буде (якщо вважати, що поточна версія версії 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);

Останній WHEREпункт необов’язковий, щоб уникнути порожніх оновлень, які б нічого не змінили (але все-таки написати нову версію рядка за повну вартість).

ypercube вже дав основне пояснення у своєму коментарі:

Ви не отримуєте дублювання. Виведена таблиця перехресне з'єднання Aі B(тобто без будь-яких умов приєднання ), а потім вибирає довільний рядок ( LIMIT 1без ORDER BY). Потім він використовує значення з цього довільного рядка для оновлення всіх рядків таблиці C. Якщо ви хочете, щоб різні значення використовувались для різних рядків C, вам доведеться приєднатись до 3 таблиць (за допомогою JOIN - ONта WHERE)

Для UPDATEотримання детальної інформації зверніться до посібника .


0

ви повинні зробити щось подібне:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.