我希望这是有道理的,让我详细说明:
有一个测验程序跟踪数据表,其中每一行都有..
QuestionID和AnswerID(每个都有一个表格)。因此,由于一个bug,有一堆QuestionID设置为NULL,但相关AnswerID的QuestionID在Answers表中。
所以说QuestionID是NULL,AnswerID是500,如果我们转到Answers表并找到AnswerID 500,那么有一个带有QuestionID的列应该是NULL值所在的列。
所以基本上我想将每个NULL QuestionID设置为等于在跟踪表中的AnswerID的Answer行上的Answers表中找到的QuestionID(与正在写入的NULL QuestionID相同的行)。 / p>
我该怎么做?
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 ...
答案 0 :(得分:154)
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
我建议在运行更新之前检查要更新的结果集(相同的查询,只需选择):
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。
答案 1 :(得分:25)
如果没有update-and-join表示法(并非所有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,因此可以说无关紧要。
答案 2 :(得分:12)
UPDATE
"QuestionTrackings"
SET
"QuestionID" = (SELECT "QuestionID" FROM "Answers" WHERE "AnswerID"="QuestionTrackings"."AnswerID")
WHERE
"QuestionID" is NULL
AND ...
答案 3 :(得分:7)
我有同样的问题。这是一个类似于eglasius的工作解决方案。 我正在使用postgresql。
UPDATE QuestionTrackings
SET QuestionID = a.QuestionID
FROM QuestionTrackings q, QuestionAnswers a
WHERE q.QuestionID IS NULL
如果在第1行使用q代替表名,则会抱怨,第2行的QuestionID之前不应该出现任何内容。
答案 4 :(得分:3)
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;
答案 5 :(得分:1)
更新第一个表中的第二个表数据需要在SET之前进行内部连接:
`UPDATE `table1` INNER JOIN `table2` ON `table2`.`id`=`table1`.`id` SET `table1`.`name`=`table2`.`name`, `table1`.`template`=`table2`.`template`;
答案 6 :(得分:1)
对于Mysql,您可以使用此查询
更新table1 a,table2 b SET a.coloumn = b.coloumn其中a.id = b.id
答案 7 :(得分:0)
以下适用于mysql
update table1 INNER JOIN table2 on table1.col1 = table2.col1
set table1.col1 = table2.col2
答案 8 :(得分:0)
我认为这应该可行。
UPDATE QuestionTrackings
SET QuestionID = (SELECT QuestionID
FROM AnswerTrackings
WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)
WHERE QuestionID IS NULL
AND AnswerID IS NOT NULL;
答案 9 :(得分:0)
UPDATE courses
INNER JOIN states on courses.state_id = states.id
SET courses.state_code = states.code
WHERE some_random_condition
这里我们通过引用主记录courses
来更新course_code
表列states