web-dev-qa-db-fra.com

SQL UPDATE SET une colonne égale à une valeur dans une table liée référencée par une colonne différente?

J'espère que cela a du sens, laissez-moi élaborer:

Il existe un tableau de suivi des données pour un programme de quiz où chaque ligne a ..

QuestionID et AnswerID (il y a une table pour chacun). Ainsi, à cause d'un bogue, un ensemble de questions d'identification a été défini sur NULL, mais le numéro d'identification de la question d'un identificateur associé est dans la table des réponses.

Donc, disons que QuestionID est NULL et que AnswerID est 500, si nous allons dans la table Réponses et trouvons le AnswerID 500, il y a une colonne avec le QuestionID qui aurait dû être où la valeur NULL est.

En gros, je veux donc que chaque QuestionID NULL soit égal à celui de la question Réponses figurant dans la table Réponses de la ligne Réponse du IDRépid qui se trouve dans la table de suivi (même ligne que la QuestionID NULL en cours d’écriture).

Comment je ferais ça?

UPDATE QuestionTrackings
SET QuestionID = (need some select query that will get the QuestionID from the AnswerID in this row)
WHERE QuestionID is NULL AND ... ?

Je ne sais pas comment je vais pouvoir lui faire assigner le QuestionID au QuestionID à partir du AnswerID correspondant ...

95
BigOmega
update q
set q.QuestionID = a.QuestionID
from QuestionTrackings q
inner join QuestionAnswers a
on q.AnswerID = a.AnswerID
where q.QuestionID is null -- and other conditions you might want

Je recommande de vérifier quel est le résultat à mettre à jour avant de lancer la mise à jour (même requête, avec un select)

select *
from QuestionTrackings q
inner join QuestionAnswers a
on q.AnswerID = a.AnswerID
where q.QuestionID is null -- and other conditions you might want

En particulier si chaque identifiant de réponse n'a définitivement qu'un identifiant de question associé.

148
eglasius

Sans la notation update-and-join (ce n'est pas tout le SGBD qui prend en charge cela), utilisez:

UPDATE QuestionTrackings
   SET QuestionID = (SELECT QuestionID
                        FROM AnswerTrackings
                        WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)
   WHERE QuestionID IS NULL
     AND EXISTS(SELECT QuestionID
                        FROM AnswerTrackings
                        WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)

Souvent, dans une requête comme celle-ci, vous devez qualifier la clause WHERE avec une clause EXISTS contenant la sous-requête. Cela empêche la mise à jour de piétiner les lignes où il n'y a pas de correspondance (généralement en annulant toutes les valeurs). Dans ce cas, puisqu'un identifiant de question manquant changerait NULL en NULL, cela n'a sans doute aucune importance.

25
Jonathan Leffler

Je ne sais pas si vous avez rencontré le même problème que moi sur MySQL Workbench, mais exécuter la requête avec le code INNER JOIN après l'instruction FROM ne fonctionnait pas pour moi. Je n'ai pas pu exécuter la requête car le programme s'est plaint de l'instruction FROM.

Donc, afin de faire fonctionner la requête, je l'ai changé pour

UPDATE table1 INNER JOIN table2 on table1.column1 = table2.column1
SET table1.column2 = table2.column4
WHERE table1.column3 = 'randomCondition';

au lieu de

UPDATE a
FROM table1 a INNER JOIN table2 b on a.column1 = b.column1
SET a.column2 = b.column4
WHERE a.column3 = 'randomCondition';

Je suppose que ma solution est la bonne syntaxe pour MySQL.

15
AxeEffect
UPDATE
    "QuestionTrackings"
SET
    "QuestionID" = (SELECT "QuestionID" FROM "Answers" WHERE "AnswerID"="QuestionTrackings"."AnswerID")
WHERE
    "QuestionID" is NULL
AND ...
12
Milen A. Radev

J'avais la même question. Voici une solution de travail similaire à celle de eglasius . J'utilise postgresql.

UPDATE QuestionTrackings
SET QuestionID = a.QuestionID
FROM QuestionTrackings q, QuestionAnswers a
WHERE q.QuestionID IS NULL

Il se plaint si q a été utilisé à la place du nom de la table à la ligne 1 et que rien ne devrait précéder QuestionID à la ligne 2.

7
Lighting Minds
 select p.post_title,m.meta_value sale_price ,n.meta_value   regular_price
    from  wp_postmeta m 
    inner join wp_postmeta n
      on m.post_id  = n.post_id
    inner join wp_posts p
      ON m.post_id=p.id 
    and m.meta_key = '_sale_price'
    and  n.meta_key = '_regular_price'
     AND p.post_type = 'product';



 update  wp_postmeta m 
inner join wp_postmeta n
  on m.post_id  = n.post_id
inner join wp_posts p
  ON m.post_id=p.id 
and m.meta_key = '_sale_price'
and  n.meta_key = '_regular_price'
 AND p.post_type = 'product'
 set m.meta_value = n.meta_value;
3
Frank

Mettre à jour les données de la 2ème table dans la 1ère table doivent être jointes avant SET 

`UPDATE `table1` INNER JOIN `table2` ON `table2`.`id`=`table1`.`id` SET `table1`.`name`=`table2`.`name`, `table1`.`template`=`table2`.`template`;
1
Santosh Singh

Pour Mysql Vous pouvez utiliser cette requête

UPDATE table1 a, table2 b SET SET a.coloumn = b.coloumn O a.id = b.id

1
Samir Patel

ci-dessous fonctionne pour mysql

update table1 INNER JOIN table2 on table1.col1 =  table2.col1
set table1.col1 =  table2.col2
0
Pravin