web-dev-qa-db-fra.com

Copier des données d'une ligne existante vers une autre ligne existante dans SQL?

J'ai un tableau plein 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 est pour un utilisateur pour un cours, donc pour les utilisateurs affectés au cours 6 et au cours 11, il y a deux lignes de données.

Le client souhaite que tous les utilisateurs qui ont terminé le cours 6 à tout moment après le 1er août 2008 aient également marqué la fin du cours 11. Cependant, je ne peux pas simplement convertir le 6 en 11 car ils veulent conserver leurs anciennes données pour le cours 6.

Donc, pour chaque ligne qui a un numéro de cours 6, est marquée comme terminée et est supérieure à la date du 1er août 2008, je veux écrire les données d'achèvement sur la ligne qui contient le suivi du cours 11 pour cet utilisateur spécifique.

Je devrais reporter les données de la ligne du cours 6 à la ligne du cours 11 afin que des choses comme le score de l'utilisateur et la date d'achèvement affichée soient déplacées.

Voici la structure du tableau:

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 seront évidemment pas reportés car c'est déjà au bon endroit.

41
MetaGuru

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

Voir cette question SO question pour plus d'informations

69
Michael La Voie

Copiez une valeur d'une ligne vers toute autre ligne qualifiée dans la même table (ou des 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 distinguer

Ensuite, spécifiez le ou les champs à copier.

Enfin, précisez les conditions de sélection des lignes

Selon les conditions, vous pouvez copier d'une seule ligne vers une série ou copier une série vers une série. Vous pouvez également spécifier différentes tables et vous pouvez même utiliser des sous-sélections ou des jointures pour autoriser l'utilisation d'autres tables pour contrôler les relations.

11
Wil Barath
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 vu la clause From d'une mise à jour, comme celle d'une sélection normale. En fait, si vous souhaitez 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.

11
eglasius

tilisez 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'
6
Chris Doggett

Essaye ça:

UPDATE barang
SET ID FROM(SELECT tblkatalog.tblkatalog_id FROM tblkatalog 
WHERE tblkatalog.tblkatalog_nomor = barang.NO_CAT) WHERE barang.NO_CAT <>'';
2
prasetyo