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

StackOverflow https://stackoverflow.com/questions/663154

  •  20-08-2019
  •  | 
  •  

質問

Iコース番号6として特定コースの追跡データの完全なテーブルを有している。

今、私はコース番号11のための新しいトラッキングデータを追加しています。

もちろん6及びコース11の両方に割り当てられたユーザのためにデータの2つの行があるので、

データの各行は、1コースのために一人のユーザのためのものである。

クライアントは、彼らがコースの彼らの古いデータを保持したいので、もちろん11用にマークも完了を持っている任意の時間8月1日後の2008コース番号6を完了したすべてのユーザーがしかし、私はちょうど6 11に変換することはできません望んでいます6ます。

6のコース番号を持つすべての行に対してだから、完全とマークされ、日付8月1日2008以上であると、私はその特定のためのコース11のトラッキングを含む行を超える完了データを書き込みたいですユーザーます。

ユーザーのスコアと投稿完了の日のようなものが上に移動されるように

私はもちろん、11行目にコース6行からのデータ上で実行する必要があります。

ここでは、テーブルの構造です。

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とユーザーID / courseID明らかに持ち越されることはありませんされます。

役に立ちましたか?

解決

たぶん私は間違った問題を読んで、私はあなたが既にコースに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関連の質問を参照してください。

他のヒント

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

私はいつも、通常の選択のいずれかのように、更新の句から見てきました。アップデートを実行する前に更新されるかを確認したい場合は実際には、あなたが選択C11で更新部品を交換取ることができます。*。レイムダックの答えに私のコメントを参照してください。

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

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つのユニークな参照にテーブルをエイリアシングすることから始めます。

次に、コピーするフィールド(複数可)を指定します。

最後に、行の選択を支配する条件を指定

あなたがシリーズに単一の行からコピーすることが条件に応じて、またはあなたがシリーズにシリーズをコピーすることができます。また、別のテーブルを指定することができ、そしてあなたも、サブ選択または関係を制御するための他のテーブルを使用できるように、加入を使用することができます。

使用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'

これを試してください:

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

これはレコード全体を対処するためにうまく機能します。

UPDATE your_table
SET new_field = sourse_field
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top