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.

Était-ce utile?

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

Consultez cette question SO reliée pour plus d'informations

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top