SQL UPDATE SET一列是否等于另一列引用的相关表中的值?

时间:2009-04-01 21:19:05

标签: sql

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

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

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 ...

10 个答案:

答案 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