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.

Foi útil?

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

Veja esta questão SO relacionada para mais informações

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top