【问题标题】:Update with a subquery in MySQL在 MySQL 中使用子查询进行更新
【发布时间】:2013-03-23 01:01:10
【问题描述】:

我有一个需要在 MySQL 中运行的更新查询,但遇到了一些问题。我花了最后一个小时研究 SO 的解决方案,但找不到真正有效的解决方案。我需要执行以下操作:

UPDATE TABLE1 SET ID = (SELECT TABLE2.ID FROM TABLE2, TABLE1 
WHERE TABLE1.NAME=TABLE2.NAME) WHERE TABLE1.ID IS NULL

我收到了Error Code: 1242. Subquery returns more than 1 row 错误。如何修改我的查询以使其成功运行?

基本上,我需要根据条件从另一个表中填写一列的所有值的空白。请在这个问题上指导我。谢谢!

【问题讨论】:

    标签: mysql sql-update subquery


    【解决方案1】:

    嗯,听起来您的姓名字段不是唯一的。您的子查询匹配多行,因此您需要找到一个唯一的 id 来匹配名称以外的其他内容,或者,如果您只想从子查询中获取第一个结果,请执行以下操作:

    UPDATE TABLE1 SET ID = (SELECT TABLE2.ID FROM TABLE2, TABLE1 WHERE TABLE1.NAME=TABLE2.NAME LIMIT 1) WHERE TABLE1.ID IS NULL

    【讨论】:

    • 另外,您应该知道子查询效率低下。大多数子查询可以替换为左连接或其他类型的连接。尽量避免子查询。
    • 我试过这个,它运行没有任何错误,除了它没有改变任何东西。在 table1 中的大约 1100 行和 table2 中的大约 150k 行上运行大约需要 2-3 分钟,并返回受影响和匹配的行数以及警告数(0),但是当我查看 table1 时,什么都没有改变.为什么会这样?
    • 尝试只运行子查询SELECT TABLE2.ID FROM TABLE2, TABLE1 WHERE TABLE1.NAME=TABLE2.NAME LIMIT 1。也许你得到的结果与你预期的不同。也运行不带 LIMIT 1 的查询,看看你得到了什么结果。这可能会给你一些关于正在发生的事情的线索。正如我所提到的,子查询效率低下,因此速度很慢。您确实为这些表设置了主键,是吗?
    • 是的,两个表都有主键。我会尝试运行它的一部分,让你知道会发生什么。谢谢指导! :)
    【解决方案2】:
    UPDATE TABLE1, TABLE2 
      SET TABLE1.ID = TABLE2.ID
      WHERE TABLE1.ID IS NULL
      AND TABLE1.NAME = TABLE2.NAME
    

    可能应该做你想做的事,假设NAME 在 TABLE1 和 TABLE2 中对于所有名称都是唯一的。

    【讨论】:

    • 我试过这个,但它给了我一个Unknown column ID in 'IN/ALL/ANY subquery' 错误。为什么会这样?
    • 这里第一个ID不明确。 SET ID 需要是`SET TABLE1.ID`。这可能会修复错误。为什么您会收到未知的列错误,而不是我不知道的模棱两可的列名错误。
    • @starshine531 感谢您的帮助,它确实坏了。我恢复了最初的答案,并发现了破坏它的错字。见sqlfiddle.com/#!8/ed7df
    • 是的,这个修改后的查询应该可以工作。 @CodingInCircles 我希望这对你有用。
    • 完美运行! :) 谢谢! :)
    【解决方案3】:

    从表 2、表 1 中选择表 2.ID WHERE TABLE1.NAME=TABLE2.NAME

    此查询返回多行

    Your Query:UPDATE TABLE1 SET ID = ( // here setting one value
    
    
    
    TABLE1.NAME=TABLE2.NAME //  more than one matched records are available
    

    这里是设置id,但是子查询返回多行时不能设置一个值

    【讨论】:

    • 这是一个答案还是一个问题?
    • @Krister Andersson 我在下面解释了原因。这是一个答案而不是问题
    • @CodingInCircles 你检查我的答案了吗
    • 感谢您的评论,但我知道为什么会这样。我想要的是修复或解决方法。你知道如何解决这个问题吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多