Обновить столбец данными из другой таблицы

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

user3001937
источник

Ответы:

19

Правильная форма была бы (предполагая текущую версию 9.3 pg из-за отсутствия информации):

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
Димитар
источник