mysql:用子查询更新,

标签 mysql sql-update inner-join

我有一个带有 select 语句的更新查询,它单独工作。它使用它来进行无效的更新。

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

我收到错误

"You can't specify target table 'data' for update in FROM clause"

所以,经过深入研究,我发现我可以编写包含另一个选择语句:

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

我收到错误

"Subquery returns more than 1 row "

因此,经过更多挖掘,我添加了一个“ANY”,因为这是常见的建议:

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

并得到

"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(select nid from node inner join data on node.title = biblio_' at line 1 "

我错过了什么?

最佳答案

如果我们想更新表 data 中的所有行表,我们可以这样做:

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

注释:

如果node中有两行或更多行title 具有相同的值(与 name 中的 data 匹配), nid 的值将分配匹配行之一的值,但不确定是哪一行。

如果有name的值在 data 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:用子查询更新,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35023658/

相关文章:

c# - 如何跳过 foreach 循环的值?

mysql - myBatis 3 从没有关系的表中查询

php - MySQL 选择全部并根据另一列更新特定列字段

mysql - 当在普通表和从索引表中进行选择之间执行内连接时,索引是否有用

javascript - 选择单选按钮后,如何使用其值动态更新另一个 PHP 变量

mysql - 下一次发生时间 SQL

mysql - INSERT FROM SELECT UPDATE ON DUPLICATES UPDATE = count(*)

mysql - 如何替换mysql中列开头的特定文本?

php - SQL INNER JOIN中如何使用AS?

mysql - 如何优化连接 3 个表的 SQL 查询