Copiare i dati da una riga esistente a un'altra riga esistente in SQL?
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.
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
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