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