Aggiorna colonna con i dati di un'altra tabella


11

Sto lavorando a un problema complicato, ma lo semplificherò.

Ho due tavoli

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

e voglio aggiornare il terzo:

C [ID, column1, column2,column3] 

Sto aggiornando un'altra terza tabella usando questa query.

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 ; 

Ho ottenuto:

UPDATE 0

Quando eseguo questa query:

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

Ho ottenuto risultati. Mi sto perdendo qualcosa ?

Dati di esempio: http://sqlfiddle.com/#!15/e4d08/5

Risposte:


19

La forma corretta sarebbe (assumendo l'attuale versione 9.3 per mancanza di informazioni):

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

L'ultima WHEREclausola è facoltativa per evitare aggiornamenti vuoti che non cambierebbero nulla (ma scriveranno comunque una nuova versione di riga a costo pieno).

ypercube ha già fornito una spiegazione di base nel suo commento:

Non ottieni duplicazioni. La tua tabella derivata è cross join Ae B(cioè senza alcuna condizione di join ) e quindi sceglie una riga arbitraria ( LIMIT 1senza ORDER BY). Quindi utilizza i valori di quella riga arbitraria per aggiornare tutte le righe della tabella C. Se si desidera utilizzare valori diversi per righe diverse di C, è necessario unire le 3 tabelle (utilizzando JOIN - ONe WHERE)

Fare riferimento al manuale acceso UPDATEper i dettagli.


0

devi fare qualcosa del genere:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.