Mettre à jour la colonne avec les données d'une autre table


11

Je travaille sur un problème compliqué, mais je vais le simplifier à ce problème.

j'ai deux tables

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

et je veux mettre à jour le troisième:

C [ID, column1, column2,column3] 

Je mets à jour une autre troisième table à l'aide de cette requête.

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 ; 

J'ai eu:

UPDATE 0

Lorsque j'exécute cette requête:

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

J'ai obtenu des résultats. Suis-je en train de manquer quelque chose?

Exemples de données: http://sqlfiddle.com/#!15/e4d08/5

Réponses:


19

La forme appropriée serait (en supposant que la version actuelle de la pg 9.3 manque d'informations):

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 dernière WHEREclause est facultative pour éviter les mises à jour vides qui ne changeraient rien (mais toujours écrire une nouvelle version de ligne à plein coût).

ypercube a déjà donné une explication de base dans son commentaire:

Vous n'obtenez pas de duplication. Votre table dérivée est une jointure croisée Aet B(c'est- à- dire sans aucune condition de jointure ), puis en choisissant une ligne arbitraire ( LIMIT 1sans ORDER BY). Il utilise ensuite les valeurs de cette ligne arbitraire pour mettre à jour toutes les lignes de la table C. Si vous souhaitez que différentes valeurs soient utilisées pour différentes lignes de C, vous devrez rejoindre les 3 tables (en utilisant JOIN - ONet WHERE)

Reportez-vous au manuel sur UPDATEpour plus de détails.


0

vous devez faire quelque chose comme ça:

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.