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:使用子查询更新,的主要内容,如果未能解决你的问题,请参考以下文章