Atualizar coluna com dados de outra tabela


11

Estou trabalhando em um problema complicado, mas vou simplificá-lo para esse problema.

Eu tenho duas mesas

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

e eu quero atualizar o terceiro:

C [ID, column1, column2,column3] 

Estou atualizando outra terceira tabela 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 ; 

Eu tenho:

UPDATE 0

Quando executo esta consulta:

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

Eu obtive resultados. Estou esquecendo de algo ?

Dados de amostra: http://sqlfiddle.com/#!15/e4d08/5

Respostas:


19

A forma correta seria (assumindo a página 9.3 atual por falta de informações):

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

A última WHEREcláusula é opcional para evitar atualizações vazias que não mudariam nada (mas ainda escrevem uma nova versão de linha a custo total).

O ypercube já deu uma explicação básica em seu comentário:

Você não recebe duplicação. Sua tabela derivada é junção cruzada Ae B(ou seja, sem nenhuma condição de junção ) e, em seguida, escolhe uma linha arbitrária ( LIMIT 1sem ORDER BY). Em seguida, ele usa os valores dessa linha arbitrária para atualizar todas as linhas da tabela C. Se você deseja que valores diferentes sejam usados ​​para linhas diferentes de C, você precisará ingressar nas 3 tabelas (usando JOIN - ONe WHERE)

Consulte o manual UPDATEpara obter detalhes.


0

você tem que fazer algo assim:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.