¿Copiar datos de una fila existente a otra fila existente en SQL?
Pregunta
Tengo una tabla llena de datos de seguimiento para un curso específico, número de curso 6.
Ahora he agregado nuevos datos de seguimiento para el curso número 11.
Cada fila de datos es para un usuario para un curso, por lo que para los usuarios asignados tanto al curso 6 como al curso 11 hay dos filas de datos.
El cliente quiere que todos los usuarios que hayan completado el curso número 6 en cualquier momento después del 1 de agosto de 2008 también tengan marcado el curso 11. Sin embargo, no puedo convertir el 6 al 11 porque quieren preservar sus datos anteriores para el curso 6.
Entonces, para cada fila que tiene un número de curso de 6, está marcada como completa y es mayor que la fecha del 1 de agosto de 2008, quiero escribir los datos de finalización sobre la fila que contiene el seguimiento del curso 11 para ese específico usuario.
Necesitaría transferir los datos de la fila 6 del curso a la fila 11 del curso para que se muevan cosas como el puntaje del usuario y la fecha de finalización publicada.
Aquí está la estructura de la tabla:
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)
Algunos valores serán NULL y userID / courseID obviamente no se transferirán ya que eso ya está en el lugar correcto.
Solución
Tal vez leí mal el problema, pero creo que ya ha insertado los registros del curso 11 y simplemente necesita actualizar aquellos que cumplen con los criterios que enumeró con los datos del curso 6.
Si este es el caso, querrá usar una declaración 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
Consulte esta pregunta SO relacionada para obtener más información
Otros consejos
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
Siempre he visto la cláusula From de una actualización, como una de una selección normal. En realidad, si desea verificar qué se actualizará antes de ejecutar la actualización, puede reemplazar las partes de actualización con una selección c11. *. Vea mis comentarios sobre la respuesta del pato cojo.
Copie un valor de una fila a cualquier otra fila calificada dentro de la misma tabla (o tablas diferentes):
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'
Comience aliasando la tabla en 2 referencias únicas para que el servidor SQL pueda distinguirlas
A continuación, especifique los campos para copiar.
Por último, especifique las condiciones que rigen la selección de las filas
Dependiendo de las condiciones, puede copiar de una sola fila a una serie, o puede copiar una serie a una serie. También puede especificar diferentes tablas, e incluso puede usar sub-selecciones o uniones para permitir el uso de otras tablas para controlar las relaciones.
Use SELECT para insertar registros
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'
Prueba esto:
UPDATE barang
SET ID FROM(SELECT tblkatalog.tblkatalog_id FROM tblkatalog
WHERE tblkatalog.tblkatalog_nomor = barang.NO_CAT) WHERE barang.NO_CAT <>'';
Esto funciona bien para hacer frente a registros completos.
UPDATE your_table
SET new_field = sourse_field