52

特定のコース、コース番号 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 は既に適切な場所にあるため、明らかに引き継がれません。

4

6 に答える 6

16
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 句を常に見てきました。実際、更新を実行する前に何が更新されるかを確認したい場合は、更新部分を選択した c11.* に置き換えることができます。ラメダックの答えに関する私のコメントを参照してください。

于 2009-03-19T17:50:25.623 に答える
11

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'

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

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

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

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

于 2010-01-21T12:20:05.007 に答える
8

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'
于 2009-03-19T17:33:59.640 に答える
0

これは、レコード全体を処理するのに適しています。

UPDATE your_table
SET new_field = sourse_field
于 2011-12-09T00:19:38.747 に答える