将数据从一个现有行复制到SQL中的另一个现有行?

我有一张桌子,里面装满了跟踪数据,作为6号课程的具体课程。

现在我已经添加了11号课程的新的跟踪数据。

每一行数据是一个用户的一个课程,所以对于分配到课程6和课程11的用户,有两行数据。

客户希望在2008年8月1日以后的任何时候完成6号课程的所有用户也要完成11号课程的标记。但是我不能把6号课程转换成11号课程,因为他们希望保留课程6的旧数据。

因此,对于课程编号为6的每一行都被标记为完成,并且大于2008年8月1日的date,我希望将该完成数据写入包含该特定用户的课程11的跟踪的行。

我将需要从课程6行到课程11行进行数据传输,因此用户评分和发布完成date等内容都会移到上面。

这是表格的结构:

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显然不会被结转,因为它已经在正确的位置。

也许我读错了,但我相信你已经插入了课程的11条logging,只需要更新那些符合你列出的课程6的数据。

如果是这种情况,您将需要使用UPDATEFROM语句:

 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 `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服务器可以区分它们

接下来,指定要复制的字段。

最后,指定控制行select的条件

根据您可能从单行复制到一个系列的条件,也可以将一个系列复制到一个系列。 您也可以指定不同的表,甚至可以使用子select或连接来允许使用其他表来控制关系。

 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的一个。 实际上,如果您想在运行更新之前检查将要更新的内容,则可以使用select c11。*来replace更新的部件。 看到我对跛脚鸭答案的评论。

使用SELECT来插入logging

 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 <>''; 

这适用于处理整个logging。

 UPDATE your_table SET new_field = sourse_field 
 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' )