Actualizar columna con datos de otra tabla

11

Estoy trabajando en un problema complicado, pero lo simplificaré a este problema.

Tengo dos mesas

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

y quiero actualizar el tercero:

C [ID, column1, column2,column3] 

Estoy actualizando otra tercera tabla usando esta consulta.

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 ; 

Tengo:

UPDATE 0

Cuando ejecuto esta consulta:

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

Tengo resultados Me estoy perdiendo de algo ?

Datos de muestra: http://sqlfiddle.com/#!15/e4d08/5

user3001937
fuente

Respuestas:

19

La forma adecuada sería (suponiendo la versión actual de la página 9.3 por falta de información):

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);

La última WHEREcláusula es opcional para evitar actualizaciones vacías que no cambiarían nada (pero aún así escribir una nueva versión de la fila a un costo total).

Ypercube ya dio una explicación básica en su comentario:

No obtienes duplicación. Su tabla derivada es la unión cruzada Ay B(es decir, sin ninguna condición de unión ) y luego elegir una fila arbitraria ( LIMIT 1sin ORDER BY). Luego usa los valores de esa fila arbitraria para actualizar todas las filas de la tabla C. Si desea utilizar diferentes valores para diferentes filas de C, deberá unir las 3 tablas (usando JOIN - ONy WHERE)

Consulte el manual UPDATEpara más detalles.

Erwin Brandstetter
fuente
0

tienes que hacer algo como esto:

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
fuente