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

Posted

技术标签:

【中文标题】SQL UPDATE SET 一列等于另一列引用的相关表中的值?【英文标题】:SQL UPDATE SET one column to be equal to a value in a related table referenced by a different column? 【发布时间】:2010-10-16 23:33:20 【问题描述】:

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

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

QuestionID 和 AnswerID(每个都有一个表)。因此,由于一个错误,有一堆 QuestionID 设置为 NULL,但相关 AnswerID 的 QuestionID 在 Answers 表中。

假设 QuestionID 为 NULL,AnswerID 为 500,如果我们转到 Answers 表并找到 AnswerID 500,则有一个 QuestionID 列应该是 NULL 值所在的位置。

所以基本上我想将每个 NULL QuestionID 设置为等于在跟踪表中 AnswerID 的 Answer 行上的 Answers 表中找到的 QuestionID(与正在写入的 NULL 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...

【问题讨论】:

mysql 和 Microsoft SQL Server 都支持 SQL 语法扩展以支持多表 UPDATE。其他品牌没有。您还没有说您使用的是什么品牌的数据库。 【参考方案1】:
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。

【讨论】:

我不知道为什么,但这对我不起作用,但确实如此:update QuestionTrackings q inner join QuestionAnswers a on q.AnswerID = a.AnswerID set q.QuestionID = a.QuestionID; 似乎是相同的基本查询,但顺序不同。知道为什么吗? @billynoah,ORA-00971:Oracle 中缺少 SET 关键字 在 MySQL 上的 phpMyAdmin 中遇到类似情况的问题。在我的情况下,源列和目标列在同一个表中,但记录选择基于另一个表。查询的“SELECT”版本有效,但 UPDTATE 语句在“FROM”处引发语法错误 我通过消除“FROM”解决了我的问题 它看起来更像这样:UPDATE table1 NATURAL JOIN table2 SET table1.col1 = table1.col2 WHERE table2.col3 ="condition" 是答案中的“update q”中的“q”是文字查询参数还是只是表名的简写?【参考方案2】:
UPDATE
    "QuestionTrackings"
SET
    "QuestionID" = (SELECT "QuestionID" FROM "Answers" WHERE "AnswerID"="QuestionTrackings"."AnswerID")
WHERE
    "QuestionID" is NULL
AND ...

【讨论】:

为我在 oracle 上工作。 @eglasius 的回答没有。【参考方案3】:

如果没有更新和连接表示法(并非所有 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,因此可以说没关系。

【讨论】:

此方法在 Oracle 12c 上对我有用(更新连接方法失败)。【参考方案4】:

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

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

如果在第 1 行中使用 q 代替表名,它会抱怨,并且第 2 行中的 QuestionID 之前不应有任何内容。

【讨论】:

【参考方案5】:
 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;

【讨论】:

【参考方案6】:

我不知道您是否在 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';

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

【讨论】:

是的,看起来对于 Mysql,JOIN 被认为是查询的 'table_references' 部分的一部分。 MySQL Join【参考方案7】:

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

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

【讨论】:

【参考方案8】:

以下适用于 mysql

update table1 INNER JOIN table2 on table1.col1 =  table2.col1
set table1.col1 =  table2.col2

【讨论】:

【参考方案9】:

对于 Mysql 你可以使用这个查询

UPDATE table1 a, table2 b SET a.coloumn = b.coloumn WHERE a.id= b.id

【讨论】:

【参考方案10】:

我认为这应该可行。

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

【讨论】:

【参考方案11】:
UPDATE courses 
INNER JOIN states on courses.state_id = states.id 
SET courses.state_code = states.code
WHERE some_random_condition

这里我们通过引用主记录states更新courses表列course_code

【讨论】:

以上是关于SQL UPDATE SET 一列等于另一列引用的相关表中的值?的主要内容,如果未能解决你的问题,请参考以下文章

求sql语句!在同一表中,如何根据一列包含的内容,替换另一列的数据?

来自一列的 SQL UPDATE 数据与来自另一列的匹配

mysql如何根据一列值更新另一列的值?

表中的一列引用 SQL 中存在重复数据的另一列

sql 怎样查1列多值全都在一个集合里面

sql一列有多值查询,根据多个只查询我想要的数据