2009-03-19 17 views
38

Tengo una tabla completa de los datos de seguimiento para el curso lo más específico, número del curso 6.¿Copia datos de una fila existente a otra fila existente en SQL?

Ahora he añadido nuevos datos de seguimiento para el número del curso 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 completaron el curso número 6 en cualquier momento después del 1 de agosto de 2008 también hayan completado el curso 11. Sin embargo, no puedo convertir el 6 a 11 porque quieren preservar sus datos anteriores curso 6.

Entonces, para cada fila que tiene un número de curso 6, está marcada como completa y es mayor que la fecha 1 de agosto de 2008, quiero escribir los datos de finalización en la fila que contiene el seguimiento del curso 11 para ese usuario específico.

Necesitaría transferir los datos de la fila del curso 6 a la fila del curso 11 para que se muevan cosas como la puntuación del usuario y la fecha de finalización publicada.

Aquí es 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 ID de usuario y/courseid, obviamente, no se transferirá como que ya está en el lugar correcto.

Respuesta

60

Tal vez leído el problema equivocado, pero creo que ya ha insertado el curso 11 registros y simplemente tenga que actualizar aquellos que cumplen con los criterios que enumeró con los datos del curso 6.

Si este es el caso, tendrá que utilizar una sentencia 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 

See this related SO question for more info

+1

si hay alguna posibilidad de que me explique cómo funciona esa cosa newdata, que parece una cosa útil, pero no estoy muy seguro de que lo entiendo – BigOmega

+0

¡Esto funcionó, gracias! – BigOmega

+0

@Ryan ¿lo ejecutó/lo verificó? – eglasius

4

Use SELECT to Insert records

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' 
+0

hmm bien, pero voy a ser capaz de hacer una DONDE comprueba que tanto el INSERT y SELECT siendo que este se encuentra en la misma mesa? – BigOmega

+0

Debería ser capaz de, dar el ejemplo Acabo de añadir una oportunidad. –

+0

Probablemente debería establecer la fecha completa también en la fecha actual, si eso es un requisito. Eso debería hacerte comenzar, sin embargo. –

10
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 uno 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 de c11. *. Vea mis comentarios sobre la respuesta del pato cojo.

10

Copiar un valor de una fila a cualquier otro filas calificadas 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' 

empezar por un alias a la tabla en 2 referencias únicas para que el servidor SQL puede decir ellos aparte

A continuación, especifique los campos para copiar.

pasado, especifica las condiciones que rigen la selección de las filas

Dependiendo de las condiciones que pueda copiar de una sola fila de una serie, o puede copiar una serie de una serie. También puede especificar tablas diferentes, e incluso puede usar sub selecciones o uniones para permitir el uso de otras tablas para controlar las relaciones.

+3

Gracias, mucho más claro que la respuesta aceptada :) – Metal450

+3

No funciona en Microsoft SQL Server. Mensaje de error: sintaxis incorrecta cerca de 't1'. – palota

+0

Estoy de acuerdo con @ Metal450 - mucho más claro. –

-1

Esto funciona bien para hacer frente a registros completos.

UPDATE your_table 
SET new_field = sourse_field 
+0

esto copia las columnas, no las filas – yzorg

1

Prueba esto:

UPDATE barang 
SET ID FROM(SELECT tblkatalog.tblkatalog_id FROM tblkatalog 
WHERE tblkatalog.tblkatalog_nomor = barang.NO_CAT) WHERE barang.NO_CAT <>''; 
-2
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' 
    ) 
+0

por favor brinde alguna explicación y también edite su publicación para tener el formato correcto – Pooya

+0

¿dónde se declara "newdata"? – Petar

Cuestiones relacionadas