【问题标题】:mysql: update with subquery,mysql:使用子查询更新,
【发布时间】: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 行“

我错过了什么?

【问题讨论】:

    标签: mysql sql-update inner-join


    【解决方案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
                     )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2021-04-20
      • 2021-11-11
      • 2014-01-26
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多