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 一列等于另一列引用的相关表中的值?的主要内容,如果未能解决你的问题,请参考以下文章