J'espère que c'était clair, laissez-moi développer :
Il y a un tableau de données de suivi pour un programme de quiz où chaque ligne a..
QuestionID et AnswerID (il y a une table pour chacun). Donc, à cause d'un bug, il y avait un tas de QuestionIDs mis à NULL, mais le QuestionID d'un AnswerID lié est dans la table Answers.
Donc disons que le QuestionID est NULL et que le AnswerID est 500, si nous allons dans la table Answers et trouvons le AnswerID 500, il y a une colonne avec le QuestionID qui aurait dû être là où se trouve la valeur NULL.
Donc, en gros, je veux que chaque QuestionID NULL soit égal au QuestionID trouvé dans la table Answers sur la ligne Answer du AnswerID qui est dans la table trackings (même ligne que le QuestionID NULL qui est écrit).
Comment dois-je m'y prendre ?
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 pourrai faire en sorte qu'il assigne le QuestionID à la QuestionID de la AnswerID correspondante...
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 jeu de résultats à mettre à jour avant de lancer la mise à jour (même requête, juste 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 id de réponse n'a qu'un seul id de question associé.
Sans la notation update-and-join (tous les SGBD ne le supportent pas), 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)
Dans une requête de ce type, il est souvent nécessaire de qualifier la clause WHERE avec une clause EXISTS qui contient la sous-requête. Cela permet d'éviter que l'UPDATE ne piétine les lignes pour lesquelles il n'y a pas de correspondance (en annulant généralement toutes les valeurs). Dans ce cas, étant donné qu'un ID de question manquant changerait le NULL en NULL, on peut dire que cela n'a pas d'importance.