2009-03-19 10 views
38

Ho una tabella completa di dati di rilevamento per il corso più specifico, numero del corso 6.Copia i dati da una riga esistente a un'altra riga esistente in SQL?

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

Ogni riga di dati è per un utente per un corso quindi, per gli utenti assegnati a entrambi i corsi 6 e 11, ci sono due righe di dati.

Il cliente desidera 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 a 11 perché vogliono conservare i loro vecchi dati per corso 6.

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

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

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 saranno riportati come che è già nel posto giusto.

risposta

60

Forse ho letto il problema sbagliato, ma credo che è già stata inserita nel corso di 11 dischi e semplicemente bisogno di aggiornare quelli che soddisfano i criteri che avete elencato con i dati naturalmente 6 di.

Se questo è il caso, ti consigliamo di usare una dichiarazione 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

ogni possibilità che tu possa spiegarmi come funziona quella cosa newdata, che sembra una cosa utile ma non sono sicuro di averlo capito – BigOmega

+0

ha funzionato, grazie! – BigOmega

+0

@Ryan l'hai eseguito/verificato? – 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 OK, ma sarò in grado di fare un WHERE che controlla sia l'INSERT e SELECT è che questo è nella stessa tabella? – BigOmega

+0

Dovrebbe essere in grado di, dare l'esempio ho appena aggiunto una prova. –

+0

Probabilmente dovrebbe impostare anche la data completa alla data corrente, se questo è un requisito. Questo dovrebbe iniziare, però. –

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 

ho sempre visto clausola From di un aggiornamento, come uno di una selezione normale. 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 di papera zoppa.

10

Copiare un valore da una riga a qualsiasi altre righe qualificati all'interno della stessa tabella (o tabelle differenti):

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' 

iniziare creando un alias per la tabella in 2 riferimenti univoci modo che il server SQL può dire a parte

Quindi, specificare i campi da copiare.

scorso, specificare le condizioni di selezione delle righe

A seconda delle condizioni si può copiare da una singola riga a una serie, o si può copiare una serie di una serie. È inoltre possibile specificare tabelle diverse e persino utilizzare i sottoselezionamenti o i join per consentire l'utilizzo di altre tabelle per il controllo delle relazioni.

+3

Grazie, molto più chiaro della risposta accettata :) – Metal450

+3

Non funziona in Microsoft SQL Server. Messaggio di errore: sintassi errata vicino a 't1'. – palota

+0

Concordo con @ Metal450: molto più chiaro. L'aggiornamento –

-1

Questo funziona bene per gestire interi record.

UPDATE your_table 
SET new_field = sourse_field 
+0

questo copia colonne, non righe – yzorg

1

Prova questo:

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

si prega di fornire qualche spiegazione e anche modificare il tuo post per avere una formattazione corretta – Pooya

+0

dove viene dichiarato "newdata"? – Petar

Problemi correlati