2009-03-19 12 views
38

Ich habe einen Tisch voller Tracking-Daten für so bestimmten Kurs, Kursnummer 6.Kopieren Sie Daten aus einer vorhandenen Zeile in eine andere vorhandene Zeile in SQL?

Jetzt habe ich neue Tracking-Daten für Kursnummer hinzugefügt 11.

Jede Reihe von Daten ist für einen Benutzer für einen Kurs Für Benutzer, die sowohl dem Kurs 6 als auch dem Kurs 11 zugeordnet sind, gibt es zwei Datenzeilen.

Der Kunde möchte, dass alle Benutzer, die Kurs 6 nach dem 1. August 2008 abgeschlossen haben, auch den Abschluss für Kurs 11 haben. Allerdings kann ich die 6 nicht einfach in 11 umwandeln, weil sie ihre alten Daten beibehalten möchten Natürlich 6.

Also für jede Zeile, die eine Kursnummer von 6 hat, ist als abgeschlossen markiert, und ist größer als das Datum 1. August 2008, möchte ich die Abschlussdaten über die Zeile, die das Tracking für Kurs enthält 11 für diesen bestimmten Benutzer.

Ich müsste die Daten aus der Zeile Kurs 6 in die Zeile Kurs 11 übertragen, damit Dinge wie Benutzerpunktzahl und Datum der geposteten Vervollständigung verschoben werden. Hier

ist die Struktur der Tabelle:

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) 

Einige Werte werden NULL und Benutzer-ID/courseID wird natürlich nicht übertragen werden, wie die bereits an der richtigen Stelle ist.

Antwort

60

Vielleicht lese ich das Problem falsch, aber ich glaube, Sie bereits den Kurs 11 Datensätze eingefügt haben und einfach diejenigen, die die Kriterien erfüllen, aktualisieren müssen Sie mit Daten Kurs 6 aufgeführt.

Wenn dies der Fall ist, werden Sie eine UPDATE ... FROM Anweisung verwenden möchten:

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

jede Chance, die Sie mir erklären könnten, wie diese newdata Sache funktioniert, die wie eine handliche Sache aussieht, aber ich bin nicht ganz sicher, ich bekomme es – BigOmega

+0

das hat funktioniert, danke! – BigOmega

+0

@Ryan hast du es ausgeführt/verifiziert? – 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, aber ich in der Lage sein, eine WHERE zu tun, die sowohl die INSERT und die SELECT prüft wird, dass diese in der gleichen Tabelle ist? – BigOmega

+0

Sollte in der Lage sein, geben Sie das Beispiel Ich habe gerade einen Versuch hinzugefügt. –

+0

Wahrscheinlich sollte das complete_date auch auf das aktuelle Datum gesetzt werden, wenn das eine Voraussetzung ist. Das sollte dich aber schon anfangen. –

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 

Ich habe immer die From-Klausel eines Updates gesehen, wie eine normale Auswahl. Wenn Sie vor dem Ausführen des Updates überprüfen möchten, was aktualisiert wird, können Sie die Aktualisierungsteile durch eine Auswahl von c11. * Ersetzen. Siehe meine Kommentare zur Antwort der lahmen Ente.

10

Kopieren Sie einen Wert von einer Zeile zu anderen qualifizierten Zeilen in derselben Tabelle (oder verschiedene Tabellen):

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' 

Beginnen Sie, indem Sie die Tabelle in zwei eindeutige Referenzen Aliasing so kann der SQL Server anweisen, sie auseinander

Geben Sie als nächstes das Feld (die Felder) an, die kopiert werden sollen.

Last, geben Sie die Bedingungen für die Auswahl der Zeilen

Je nach den Bedingungen regeln Sie von einer einzelnen Zeile zu einer Reihe kopieren, oder Sie können eine Serie zu einer Reihe kopieren. Sie können auch andere Tabellen angeben, und Sie können sogar Unterauswahlen oder Joins verwenden, um die Verwendung anderer Tabellen zum Steuern der Beziehungen zu ermöglichen.

+3

Danke, viel klarer als die akzeptierte Antwort :) – Metal450

+3

Es funktioniert nicht in Microsoft SQL Server. Fehlermeldung: Falsche Syntax in der Nähe von 't1'. – palota

+0

Ich stimme @ Metal450 - viel klarer. –

-1

Dies funktioniert gut für die Bewältigung der gesamten Datensätze.

UPDATE your_table 
SET new_field = sourse_field 
+0

kopiert diese Spalten, nicht Zeilen – yzorg

1

Try this:

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

bitte erklären Sie etwas und bearbeiten Sie auch Ihren Beitrag, um die richtige Formatierung zu haben – Pooya

+0

wo wird "newdata" deklariert? – Petar