mysql:使用子查询更新,

Posted

技术标签:

【中文标题】mysql:使用子查询更新,【英文标题】:mysql: update with subquery, 【发布时间】:2016-05-03 14:17:44 【问题描述】:

我有一个带有 select 语句的更新查询,它单独工作。它正在将它用于无法正常工作的更新。

update data set data.id = (select nid from node inner join data on node.title = data.name);

我得到了错误

“您不能在 FROM 子句中指定目标表‘数据’进行更新”

所以,经过一番挖掘,我发现我可以写另一个 select 语句:

update data set data.id = (select nid from(select nid from node inner join data on node.title = data.name) AS temptable);

我得到了错误

"子查询返回多于 1 行"

所以在更多挖掘之后,我添加了一个“ANY”,因为这是常见的建议:

update data set data.id = (select nid from ANY (select nid from node inner join data on node.title = data.name) AS temptable);

得到

“您的 SQL 语法有错误;请查看手册 对应于您的 mysql 服务器版本,以便使用正确的语法 附近'(从node.title = biblio_上的节点内部连接数据中选择nid 在第 1 行“

我错过了什么?

【问题讨论】:

【参考方案1】:

如果要更新data 表中的所有行,可以执行以下操作:

UPDATE data
  LEFT
  JOIN node
    ON node.title = data.name
   SET data.id = node.nid

注意事项:

如果node 中有多个行与title 的值相同,与data 中的name 匹配,则无法确定nid 的值将从这些行中的哪一行分配。

如果data 表中有name 的值在node 表中找不到(在title 列中),则将NULL 值分配给id 列。

对查询的一些调整可以修改此行为。

可以使用子查询来完成此操作,但我只会使用连接操作。我认为您可以使用相关子查询,如下所示:

UPDATE data
   SET data.id = ( SELECT node.nid
                     FROM node
                    WHERE node.title = data.name
                    ORDER BY node.nid
                    LIMIT 1
                 )

【讨论】:

以上是关于mysql:使用子查询更新,的主要内容,如果未能解决你的问题,请参考以下文章

使用子查询改进 MySql 查询左外连接

Mysql第八期 子查询

MySQL数据库基础(子查询与链接)(持续更新中)

MYSQL 更新与 WHERE SELECT 子查询错误

mysql 子查询 根据查询结果更新表

带有子查询的 MySQL 条件更新