SQL UPDATE SET一个列是否等于不同列所引用的相关表中的值?

我希望这是有道理的,让我详细说明一下:

有一个测验程序的跟踪数据表,每一行都有..

QuestionID和AnswerID(每个都有一个表格)。 所以由于一个bug,有一堆的QuestionID设置为NULL,但相关AnswerID的QuestionID在Answers表中。

所以说QuestionID是NULL,并且AnswerID是500,如果我们去的Answers表和查找答案ID 500有一个列的QuestionID应该是NULL值的位置。

所以基本上我想将每个NULL QuestionID设置为等于在跟踪表(与正在写入的NULL QuestionID相同的行)的AnswerID的Answer行上的Answers表中find的QuestionID。

我将如何做到这一点?

UPDATE QuestionTrackings SET QuestionID = (need some select query that will get the QuestionID from the AnswerID in this row) WHERE QuestionID is NULL AND ... ? 

不知道我将如何能够使其将QuestionID从匹配的AnswerID分配给QuestionID …

 update q set q.QuestionID = a.QuestionID from QuestionTrackings q inner join QuestionAnswers a on q.AnswerID = a.AnswerID where q.QuestionID is null -- and other conditions you might want 

我build议在运行更新之前检查要更新的结果集(相同的查询,只是使用select):

 select * from QuestionTrackings q inner join QuestionAnswers a on q.AnswerID = a.AnswerID where q.QuestionID is null -- and other conditions you might want 

特别是每个答案ID是否只有1个相关的问题ID。

如果没有更新和连接符号(并不是所有的DBMS都支持),请使用:

 UPDATE QuestionTrackings SET QuestionID = (SELECT QuestionID FROM AnswerTrackings WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID) WHERE QuestionID IS NULL AND EXISTS(SELECT QuestionID FROM AnswerTrackings WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID) 

通常在这样的查询中,您需要使用包含子查询的EXISTS子句来限定WHERE子句。 这样可以防止UPDATE对不匹配的行进行践踏(通常将所有值都归零)。 在这种情况下,由于丢失的问题ID会将NULL更改为NULL,因此无关紧要。

 UPDATE "QuestionTrackings" SET "QuestionID" = (SELECT "QuestionID" FROM "Answers" WHERE "AnswerID"="QuestionTrackings"."AnswerID") WHERE "QuestionID" is NULL AND ... 

我不知道在MySQL Workbench中是否遇到了与我相同的问题,但是在FROM语句不适用于我之后,使用INNER JOIN运行查询。 我无法运行查询,因为程序抱怨了FROM语句。

所以为了使查询工作,我改变了

 UPDATE table1 INNER JOIN table2 on table1.column1 = table2.column1 SET table1.column2 = table2.column4 WHERE table1.column3 = 'randomCondition'; 

代替

 UPDATE a FROM table1 a INNER JOIN table2 b on a.column1 = b.column1 SET a.column2 = b.column4 WHERE a.column3 = 'randomCondition'; 

我想我的解决scheme是MySQL的正确语法。

我有同样的问题。 这是一个类似于eglasius的工作解决scheme。 我正在使用postgresql。

 UPDATE QuestionTrackings SET QuestionID = a.QuestionID FROM QuestionTrackings q, QuestionAnswers a WHERE q.QuestionID IS NULL 

如果在第1行中使用q来代替表名,它会投诉,第2行中的QuestionID之前不应该有任何内容。

  select p.post_title,m.meta_value sale_price ,n.meta_value regular_price from wp_postmeta m inner join wp_postmeta n on m.post_id = n.post_id inner join wp_posts p ON m.post_id=p.id and m.meta_key = '_sale_price' and n.meta_key = '_regular_price' AND p.post_type = 'product'; update wp_postmeta m inner join wp_postmeta n on m.post_id = n.post_id inner join wp_posts p ON m.post_id=p.id and m.meta_key = '_sale_price' and n.meta_key = '_regular_price' AND p.post_type = 'product' set m.meta_value = n.meta_value; 

更新第一个表中的第二个表数据需要SET之前的内部连接:

 `UPDATE `table1` INNER JOIN `table2` ON `table2`.`id`=`table1`.`id` SET `table1`.`name`=`table2`.`name`, `table1`.`template`=`table2`.`template`;