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
La forme appropriée serait (en supposant la version actuelle de la pg 9.3 par 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 clause WHERE
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 joint de manière croisée
A
etB
(c'est-à-dire sans aucune condition de jointure ), puis en choisissant une ligne arbitraire (LIMIT 1
sans pour autantORDER BY
). Il utilise ensuite les valeurs de cette ligne arbitraire pour mettre à jour toutes les lignes de la tableC
. Si vous souhaitez que différentes valeurs soient utilisées pour différentes lignes de C, vous devrez rejoindre les 3 tables (en utilisantJOIN - ON
etWHERE
)
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