Copier les données d'une ligne existante vers une autre ligne existante en SQL?
Question
J'ai un tableau complet de données de suivi pour un cours spécifique, le cours numéro 6.
Maintenant, j'ai ajouté de nouvelles données de suivi pour le cours numéro 11.
Chaque ligne de données correspond à un utilisateur pour un cours. Par conséquent, pour les utilisateurs affectés aux cours 6 et 11, il existe deux lignes de données.
Le client souhaite que tous les utilisateurs ayant suivi le cours 6 après le 1er août 2008 aient également terminé le cours 11. Toutefois, je ne peux pas simplement convertir le 6 en 11 car ils souhaitent conserver leurs anciennes données pour le cours. 6.
Donc, pour chaque ligne qui a un numéro de cours de 6, est marquée comme terminée et est supérieure à la date du 1er août 2008, je souhaite écrire les données d'achèvement sur la ligne qui contient le suivi du cours 11 pour ce cours spécifique. utilisateur.
Il me faudrait reporter les données de la rangée du cours 6 sur la rangée du cours 11 pour que des éléments tels que le score de l'utilisateur et la date d'achèvement posté soient déplacés.
Voici la structure de la table:
userID (int)
courseID (int)
course (bit)
bookmark (varchar(100))
course_date (datetime)
posttest (bit)
post_attempts (int)
post_score (float)
post_date (datetime)
complete (bit)
complete_date (datetime)
exempted (bit)
exempted_date (datetime)
exempted_reason (int)
emailSent (bit)
Certaines valeurs seront NULL et userID / courseID ne sera évidemment pas reporté car il est déjà au bon endroit.
La solution
J'ai peut-être mal lu le problème, mais je pense que vous avez déjà inséré les enregistrements du cours 11 et que vous devez simplement mettre à jour ceux qui répondent aux critères que vous avez énumérés avec les données du cours 6.
Si tel est le cas, vous voudrez utiliser une instruction UPDATE
... FROM
:
UPDATE MyTable
SET
complete = 1,
complete_date = newdata.complete_date,
post_score = newdata.post_score
FROM
(
SELECT
userID,
complete_date,
post_score
FROM MyTable
WHERE
courseID = 6
AND complete = 1
AND complete_date > '8/1/2008'
) newdata
WHERE
CourseID = 11
AND userID = newdata.userID
Autres conseils
UPDATE c11
SET
c11.completed= c6.completed,
c11.complete_date = c6.complete_date,
-- rest of columns to be copied
FROM courses c11 inner join courses c6 on
c11.userID = c6.userID
and c11.courseID = 11 and c6.courseID = 6
-- and any other checks
J'ai toujours consulté la clause From d'une mise à jour, comme celle d'une sélection normale. En fait, si vous voulez vérifier ce qui sera mis à jour avant d'exécuter la mise à jour, vous pouvez remplacer les pièces de mise à jour par un c11. * Sélectionné. Voir mes commentaires sur la réponse du canard boiteux.
Copiez une valeur d'une ligne vers toute autre ligne qualifiée de la même table (ou de tables différentes):
UPDATE `your_table` t1, `your_table` t2
SET t1.your_field = t2.your_field
WHERE t1.other_field = some_condition
AND t1.another_field = another_condition
AND t2.source_id = 'explicit_value'
Commencez par aliaser la table en 2 références uniques afin que le serveur SQL puisse les différencier
Ensuite, spécifiez le ou les champs à copier.
Enfin, spécifiez les conditions régissant la sélection des lignes
Selon les conditions, vous pouvez copier une seule ligne dans une série ou copier une série dans une série. Vous pouvez également spécifier différentes tables et même utiliser des sous-sélections ou des jointures pour permettre à d'autres tables de contrôler les relations.
Utiliser SELECT pour insérer des enregistrements
INSERT tracking (userID, courseID, course, bookmark, course_date, posttest, post_attempts, post_score, post_date, complete, complete_date, exempted, exempted_date, exempted_reason, emailSent)
SELECT userID, 11, course, bookmark, course_date, posttest, post_attempts, post_score, post_date, complete, complete_date, exempted, exempted_date, exempted_reason, emailSent
FROM tracking WHERE courseID = 6 AND course_date > '08-01-2008'
Essayez ceci:
UPDATE barang
SET ID FROM(SELECT tblkatalog.tblkatalog_id FROM tblkatalog
WHERE tblkatalog.tblkatalog_nomor = barang.NO_CAT) WHERE barang.NO_CAT <>'';
Cela fonctionne bien pour copier des enregistrements entiers.
UPDATE your_table
SET new_field = sourse_field