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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top