Copiar dados de uma linha existente para outra linha existente no SQL?
Pergunta
Eu tenho uma tabela cheia de rastreamento de dados para como curso específico, número do curso 6.
Agora eu adicionei novos dados de rastreamento para o curso de número 11.
Cada linha de dados é para um usuário para um curso, portanto, para os usuários atribuídos a ambos curso de 6 e campo de 11 há duas linhas de dados.
O cliente quer que todos os usuários que tenham concluído curso número 6 qualquer momento após 01 de agosto de 2008 para também ter conclusão marcada para o curso 11. No entanto eu não posso simplesmente converter o 6 a 11, porque eles querem preservar seus dados antigos para curso 6.
Assim, para cada linha que tem um número de curso de 6, é marcada como concluída, e é maior do que a data de 01 de agosto de 2008, eu quero escrever os dados de conclusão sobre a linha que contém o rastreamento para o curso de 11 para esse específico usuário.
Eu preciso transitar os dados da linha curso de 6 para a linha curso 11 assim que as coisas como pontuação de usuário e data de conclusão postada é movido sobre.
Aqui está a estrutura da tabela:
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)
Alguns valores será nula e userID / CourseID, obviamente, não serão transferidos como que já está no lugar certo.
Solução
Talvez eu li o errado problema, mas eu acredito que você já inseriu o curso 11 registros e simplesmente precisa atualizar os que atenderem aos critérios listados com os dados claro 6 de.
Se este for o caso, você vai querer usar uma instrução 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
Outras dicas
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
Eu sempre viram a cláusula FROM de uma atualização, como um de um seleto normal. Na verdade, se você quiser verificar o que vai ser atualizado antes de executar a atualização, você pode tomar substituir as peças de atualização com um c11 select. *. Veja meus comentários sobre a resposta do pato manco.
Copiar um valor de uma linha para quaisquer outras linhas qualificadas dentro da mesma tabela (ou tabelas 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'
Comece por aliasing a tabela em 2 referências únicas para que o servidor SQL pode distingui-los
Em seguida, especificar o campo (s) para copiar.
Por último, especificar as condições que regem a selecção das linhas
Dependendo das condições que você pode copiar a partir de uma única linha de uma série, ou você pode copiar uma série de uma série. Você também pode especificar tabelas diferentes, e você ainda pode usar subseleções ou junta-se a permitir o uso de outras tabelas para controlar os relacionamentos.
Use SELECT para inserir 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'
Tente isto:
UPDATE barang
SET ID FROM(SELECT tblkatalog.tblkatalog_id FROM tblkatalog
WHERE tblkatalog.tblkatalog_nomor = barang.NO_CAT) WHERE barang.NO_CAT <>'';
Isso funciona bem para lidar registros inteiros.
UPDATE your_table
SET new_field = sourse_field