Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中使用子查询更新_Mysql_Sql Update_Subquery - Fatal编程技术网

在MySQL中使用子查询更新

在MySQL中使用子查询更新,mysql,sql-update,subquery,Mysql,Sql Update,Subquery,我有一个更新查询,我需要在MySQL中运行,但遇到了一些问题。我花了最后一个小时研究了一个解决方案,但没有找到一个真正有效的。我需要做以下工作: UPDATE TABLE1 SET ID = (SELECT TABLE2.ID FROM TABLE2, TABLE1 WHERE TABLE1.NAME=TABLE2.NAME) WHERE TABLE1.ID IS NULL 我得到了错误代码:1242。子查询返回多行错误。如何修改查询以使其成功运行 基本上,我需要根据一个条件,从另一个表中填

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

UPDATE TABLE1 SET ID = (SELECT TABLE2.ID FROM TABLE2, TABLE1 
WHERE TABLE1.NAME=TABLE2.NAME) WHERE TABLE1.ID IS NULL
我得到了错误代码:1242。子查询返回多行错误。如何修改查询以使其成功运行


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

从表2、表1中选择表2.ID 其中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,但当子查询返回多行时,它无法设置一个值

从表2、表1中选择表2.id
UPDATE TABLE1, TABLE2 
  SET TABLE1.ID = TABLE2.ID
  WHERE TABLE1.ID IS NULL
  AND TABLE1.NAME = TABLE2.NAME
其中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,但当子查询返回多行时,它不能设置一个值

UPDATE TABLE1, TABLE2 
  SET TABLE1.ID = TABLE2.ID
  WHERE TABLE1.ID IS NULL
  AND TABLE1.NAME = TABLE2.NAME
可能应该做您想做的事情,假设所有名称的名称都是唯一的,如表1和表2所示


如果所有名称都是表1和表2中唯一的名称,则可能需要执行您想要的操作。

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

更新表1集合ID=从表2、表1中选择表2.ID
其中TABLE1.NAME=TABLE2.NAME LIMIT 1其中TABLE1.ID为空

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

更新表1集合ID=从表2、表1中选择表2.ID

其中TABLE1.NAME=TABLE2.NAME LIMIT 1其中TABLE1.ID为NULL

这是一个答案还是一个问题?@Krister Andersson我在下面解释了原因。这不是一个答案question@CodingInCircles你看过我的回答了吗谢谢你的评论,但我知道为什么会这样。我想要的是修复或解决方法。你知道如何解决这个问题吗?谢谢“这应该是一个答案还是一个问题?”我在下面解释了原因。这不是答案question@CodingInCircles你看过我的回答了吗谢谢你的评论,但我知道为什么会这样。我想要的是修复或解决方法。你知道如何解决这个问题吗?谢谢此外,您应该知道子查询效率低下。大多数子查询可以替换为左连接或其他类型的连接。如果可以的话,尽量避免子查询。我试过了,它运行时没有任何错误,只是没有改变任何东西。在表1中的大约1100行和表2中的大约150k行上运行大约需要2-3分钟,并返回受影响和匹配的行数和警告数0,但是当我查看表1时,没有任何变化。为什么会这样?试着只运行子查询SELECT TABLE2.ID FROM TABLE2,TABLE1其中TABLE1.NAME=TABLE2.NAME LIMIT 1。也许你从中得到的结果与你预期的不同。还可以不使用限制1运行查询,查看得到的结果。这可能会给你一些线索,看看发生了什么。正如我提到的,子查询效率很低,因此速度很慢。您确实为这些表设置了主键,是吗?是的,两个表都有主键。我会试着运行它的一部分,让你知道会发生什么。谢谢你的指导!:此外,您应该知道子查询效率低下。大多数子查询可以替换为左连接或其他类型的连接。如果可以的话,尽量避免子查询。我试过了,它运行时没有任何错误,只是没有改变任何东西。在表1中的大约1100行和表2中的大约150k行上运行大约需要2-3分钟,并返回受影响和匹配的行数和警告数0,但是当我查看表1时,没有任何变化。为什么会这样?试着只运行子查询SELECT TABLE2.ID FROM TABLE2,TABLE1其中TABLE1.NAME=TABLE2.NAME LIMIT 1。也许你从中得到的结果与你预期的不同。还可以不使用限制1运行查询,查看得到的结果。这可能会给你一些线索,看看发生了什么。正如我提到的,子查询效率很低,因此速度很慢。您确实为这些表设置了主键,是吗?是的,两个表都有主键。我会试着运行它的一部分,让你知道会发生什么。谢谢你的指导!:我尝试了这个,但在“in/ALL/ANY subquery”错误中,它给了我一个未知的列ID。为什么会这样?第一个ID在这里不明确。集合ID必须是“集合表1.ID”。这可能会修复错误。为什么会出现未知列错误,而不是模棱两可的列名错误?我不知道。@starshine531谢谢您的帮助,它在
契约破裂了。我又回到了最初的答案,发现是打字错误打破了它。请参见“是”,此修改后的查询应能正常工作@CodingCircles我希望这对您有效。非常有效!:谢谢我尝试了这个,但在“in/ALL/ANY subquery”错误中,它给了我一个未知的列ID。为什么会这样?第一个ID在这里不明确。集合ID必须是“集合表1.ID”。这可能会修复错误。为什么会出现未知列错误,而不是模棱两可的列名错误?我不知道。@starshine531谢谢您的帮助,它确实坏了。我又回到了最初的答案,发现是打字错误打破了它。请参见“是”,此修改后的查询应能正常工作@CodingCircles我希望这对您有效。非常有效!:谢谢