web-dev-qa-db-ja.com

SQLの既存の行から別の既存の行にデータをコピーしますか?

特定のコース、コース番号6の追跡データでいっぱいのテーブルがあります。

これで、コース番号11の新しい追跡データが追加されました。

データの各行は、1つのコースの1人のユーザー用です。そのため、コース6とコース11の両方に割り当てられたユーザーには、2行のデータがあります。

クライアントは、2008年8月1日以降にコース番号6を完了したすべてのユーザーに、コース11の完了マークを付けることを望んでいます。

したがって、コース番号が6のすべての行が完了としてマークされ、2008年8月1日よりも大きい場合、その特定のユーザーのコース11の追跡を含む行に完了データを書き込みます。

コース6行からコース11行にデータを引き継ぐ必要があるので、ユーザーのスコアや投稿された完了日などが移動されます。

テーブルの構造は次のとおりです。

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)

一部の値はNULLになり、userID/courseIDはすでに適切な場所にあるため、明らかに引き継がれません。

41
MetaGuru

問題を間違って読んだかもしれませんが、コース11のレコードをすでに挿入しており、コース6のデータでリストした基準を満たすレコードを更新するだけでよいと思います。

この場合、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

関連するSO詳細については質問)を参照してください

69
Michael La Voie

値を1つの行から同じテーブル(または異なるテーブル)内の他の修飾された行にコピーします:

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'

SQLサーバーがそれらを区別できるように、テーブルを2つの一意の参照にエイリアスすることから始めます

次に、コピーするフィールドを指定します。

最後に、行の選択を管理する条件を指定します

条件に応じて、単一の行からシリーズにコピーしたり、シリーズをシリーズにコピーしたりできます。別のテーブルを指定することもできます。また、サブセレクトまたは結合を使用して、他のテーブルを使用して関係を制御することもできます。

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

通常の選択のように、更新のFrom句を常に表示しています。実際に、アップデートを実行する前に何がアップデートされるかを確認したい場合は、アップデートパーツをselect c11。*に置き換えることができます。足の不自由なアヒルの答えに対する私のコメントをご覧ください。

11
eglasius

レコードを挿入するためにSELECTを使用

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

これを試して:

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