Domanda

Ho una tabella piena di dati di tracciamento per come corso specifico, corso numero 6.

Ora ho aggiunto nuovi dati di tracciamento per il corso numero 11.

Ogni riga di dati è per un utente per un corso, quindi per gli utenti assegnati sia al corso 6 che al corso 11 ci sono due file di dati.

Il client vuole che tutti gli utenti che hanno completato il corso numero 6 in qualsiasi momento dopo il 1 agosto 2008 abbiano anche il completamento contrassegnato per il corso 11. Tuttavia, non posso semplicemente convertire i 6 in 11 perché vogliono conservare i loro vecchi dati per il corso 6.

Quindi per ogni riga che ha un numero di corso di 6, è contrassegnata come completa ed è maggiore della data del 1 agosto 2008, voglio scrivere i dati di completamento sulla riga che contiene il tracciamento per il corso 11 per quello specifico utente.

Avrei bisogno di trasferire i dati dalla riga 6 del corso alla riga 11 del corso in modo che cose come il punteggio utente e la data di completamento pubblicato vengano spostati.

Ecco la struttura della tabella:

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)

Alcuni valori saranno NULL e userID / courseID ovviamente non verranno riportati poiché è già nel posto giusto.

È stato utile?

Soluzione

Forse ho letto male il problema, ma credo che tu abbia già inserito i record del corso 11 e che debba semplicemente aggiornare quelli che soddisfano i criteri che hai elencato con i dati del corso 6.

In questo caso, ti consigliamo di utilizzare un'istruzione 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

Vedi questa domanda SO correlata per maggiori informazioni

Altri suggerimenti

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

Ho sempre visto la clausola From di un aggiornamento, come una normale selezione. In realtà, se si desidera verificare cosa verrà aggiornato prima di eseguire l'aggiornamento, è possibile sostituire le parti di aggiornamento con un c11 selezionato. *. Vedi i miei commenti sulla risposta dell'anatra zoppa.

Copia un valore da una riga a qualsiasi altra riga qualificata all'interno della stessa tabella (o tabelle diverse):

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'

Inizia aliasando la tabella in 2 riferimenti univoci in modo che il server SQL possa distinguerli

Successivamente, specifica i campi da copiare.

Infine, specifica le condizioni che regolano la selezione delle righe

A seconda delle condizioni che è possibile copiare da una singola riga a una serie o è possibile copiare una serie in una serie. Puoi anche specificare tabelle diverse e puoi persino utilizzare sottoselezioni o join per consentire l'utilizzo di altre tabelle per controllare le relazioni.

Usa SELEZIONA per inserire i record

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'

Prova questo:

UPDATE barang
SET ID FROM(SELECT tblkatalog.tblkatalog_id FROM tblkatalog 
WHERE tblkatalog.tblkatalog_nomor = barang.NO_CAT) WHERE barang.NO_CAT <>'';

Funziona bene per far fronte a interi record.

UPDATE your_table
SET new_field = sourse_field
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top