it-swarm.com.de

Daten aus einer vorhandenen Zeile in eine andere vorhandene Zeile in SQL kopieren?

Ich habe eine Tabelle mit Tracking-Daten für einen bestimmten Kurs, Kursnummer 6.

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

Jede Datenzeile ist für einen Benutzer für einen Kurs vorgesehen, sodass für Benutzer, die sowohl Kurs 6 als auch Kurs 11 zugeordnet sind, zwei Datenzeilen vorhanden sind.

Der Kunde möchte, dass alle Benutzer, die den 6. Kurs nach dem 1. August 2008 zu einem beliebigen Zeitpunkt abgeschlossen haben, auch den 11. Kurs als abgeschlossen markieren. Allerdings kann ich die 6 nicht einfach in die 11 konvertieren, da sie ihre alten Daten für den 6. Kurs beibehalten möchten.

Daher möchte ich für jede Zeile mit der Kursnummer 6, die als vollständig markiert ist und älter als der 1. August 2008 ist, die Abschlussdaten über die Zeile schreiben, die die Verfolgung für Kurs 11 für diesen bestimmten Benutzer enthält.

Ich müsste die Daten aus der 6. in die 11. Reihe des Kurses übertragen, damit Dinge wie der Benutzer-Score und das Datum der Fertigstellung 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 sind NULL und die Benutzer-ID/Kurs-ID wird offensichtlich nicht übernommen, da sie sich bereits an der richtigen Stelle befindet.

41
MetaGuru

Vielleicht habe ich das Problem falsch gelesen, aber ich glaube, Sie haben bereits die Kurs-11-Datensätze eingefügt und müssen nur die Datensätze aktualisieren, die den Kriterien entsprechen, die Sie mit den Daten von Kurs 6 angegeben haben.

In diesem Fall möchten Sie eine UPDATE...FROM -Anweisung verwenden:

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

Siehe diese verwandte SO Frage für weitere Informationen

69
Michael La Voie

Kopieren Sie einen Wert aus einer Zeile in andere qualifizierte Zeilen in derselben Tabelle (oder in anderen 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 gliedern, damit der SQL Server sie unterscheiden kann

Geben Sie als Nächstes die zu kopierenden Felder an.

Zuletzt legen Sie die Bedingungen für die Auswahl der Zeilen fest

Abhängig von den Bedingungen können Sie eine einzelne Zeile in eine Serie kopieren oder eine Serie in eine Serie kopieren. Sie können auch andere Tabellen angeben und sogar Unterauswahlen oder Verknüpfungen verwenden, um die Verwendung anderer Tabellen zur Steuerung der Beziehungen zu ermöglichen.

11
Wil Barath
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 die From-Klausel eines Updates immer wie eine normale Select-Klausel angesehen. Wenn Sie überprüfen möchten, was aktualisiert wird, bevor Sie das Update ausführen, können Sie die Update-Teile durch ein ausgewähltes c11. * Ersetzen. Siehe meine Kommentare zur Antwort der lahmen Ente.

11
eglasius

Verwenden Sie SELECT, um Datensätze einzufügen

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'
6
Chris Doggett

Versuche dies:

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