【问题标题】:MySQL - Update values based on subqueryMySQL - 基于子查询更新值
【发布时间】:2015-01-25 01:59:19
【问题描述】:

假设我有选择,它从 table1 返回我:

ID  Name
 1  Bob
 2  Alice
 3  Joe

然后我想根据这个结果在另一个表中更新值:

UPDATE table2 SET Name = table1.Name WHERE ID = table1.ID

据我了解,我只能在一个地方进行内部选择,例如:

UPDATE table2 SET Name = (select Name from table1) WHERE ...

而且我不知道如何指定 WHERE 条件。

【问题讨论】:

  • 将它们存储在变量中并将它们传递给更新
  • @Harry 这是一个坏主意,因为它是一个逗号分隔的字符串,您不能在IN() 上使用它,所有 OP 需要的只是一个简单的连接。

标签: mysql select sql-update


【解决方案1】:

你应该做的就是像这样加入表格。

UPDATE table2 t2
JOIN table1 t1 ON t1.id = t2.id
SET t2.name = t1.name;

RESULTS WITH JOIN

如果你打算用一个选择来做,你可以这样做。

UPDATE table2 t2,
(   SELECT Name, id 
    FROM table1 
) t1
SET t2.name = t1.name
WHERE t1.id = t2.id

RESULTS FROM SELECT

【讨论】:

  • 这就像一个魅力!非常感谢!
  • 谢谢您,先生,您的回答解决了我困扰数日的问题。
  • @theburningfire 乐于助人!如果您还有任何问题,请随时提出,我可以尝试提供帮助:D
【解决方案2】:
 UPDATE table2
 SET name = (SELECT table1.Name FROM table1 WHERE table1.id = table2.id)
 WHERE apply_condition

编辑:#1

   UPDATE table2 t2, (SELECT id, name FROM table1) t1 SET t2.name = t1.name WHERE t1.id = t2.id

请阅读此link,another

【讨论】:

  • 我不是反对者,但你知道你拥有的子查询是一个相关的子查询,这意味着它会为 table2 中的每一行执行......这通常是一个糟糕的设计。还有你的 SET 之后的 WHERE 是多余的
  • @JohnRuddell 感谢您的申请 ....但我正在使用子查询 SELECT table1.Name FROM table1 WHERE table1.id = table2.id 我使用的条件是哪一个是 table1.id = table2.id..这意味着首先检查 table2.id 然后它的更新..
  • 子查询中正好是WHERE table1.id = table2.id ..将一个ID与子查询中的每个ID进行比较,然后一遍又一遍地进行这是一个糟糕的查询...查询的一部分是@ 987654326@ 是多余的,没有添加任何东西
  • 确定 :) 如果您将查询更改为仅选择然后设置名称,它将是一次选择......类似这样的事情。 UPDATE table2, (SELECT id, name FROM table1) t1 SET t2.name = t1.name WHERE t1.id = t2.id
  • 感谢 RajibGhosh 和 JohnRuddell 的讨论,为每一行执行的子查询正是我想要的
【解决方案3】:

试试这个

Update table2
Set Name = (Select Name From table1 where table1.ID = table2.ID)
Where table2.ID In (Select ID From table1) 

【讨论】:

  • @JohnRuddell 如果 Where 子句不存在,则更新将应用于 table2 中的所有行,无论它们在 table1 中是否有相应的行。在没有相应条目的情况下,子查询将返回 null,而这将用于更新,这绝对是坏事。 where 子句使更新仅适用于实际在 table1 中的 ID。
  • 是的,但这也意味着您正在为另一个表中的每一行以及另一个 IN() 相关子查询执行相关子查询。对此的优化很糟糕。为什么不直接加入表呢?
  • 一些原因,但有些猜测。首先,假设由于用于连接的字段名称是“ID”,因此它们可能是主键并被索引,因此优化器将使用索引来查找所需的确切行集,并且可能仅从索引中执行此操作无需进入数据本身(当然,实际更新更改除外)。其次,连接并不适用于所有数据库,尤其是 SQL Server,它为此目的使用了一个特殊的 From。尽管问题是专门针对 MySQL 的,但我通常会尽可能使用与平台无关的查询。 ...
  • 第三,这有点像一次性查询来纠正问题。如果它是一个定期执行很多次的查询,并且计时/分析器表明性能不佳,我会根据它重新设计它,但否则就像我说的那样,我会倾向于在所有平台上都有效的方法。但请注意,这可能会在某些情况下导致性能不佳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2021-09-20
  • 1970-01-01
  • 2012-07-20
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多