2013-03-23 69 views
0

我有一个更新查询,我需要在MySQL中运行,并且遇到了一些麻烦。我花了最后一个小时研究一个解决方案,但找不到真正有用的解决方案。我需要执行以下操作:使用MySQL中的子查询进行更新

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错误。我如何修改我的查询以使其成功运行?

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

回答

1
UPDATE TABLE1, TABLE2 
    SET TABLE1.ID = TABLE2.ID 
    WHERE TABLE1.ID IS NULL 
    AND TABLE1.NAME = TABLE2.NAME 

可能应该做你想要什么,假设NAME是唯一一个所有名称的ccross TABLE1和TABLE2。

+0

我试过这个,但它给了我一个'IN/ALL/ANY子查询'错误中的未知列ID。为什么会发生? – CodingInCircles 2013-03-24 02:02:41

+0

第一个ID在这里不明确。 'SET ID'需要是'SET TABLE1.ID'。这可能会修复错误。为什么你会遇到未知的列错误,而不是一个不明确的列名错误,我不知道。 – starshine531 2013-03-24 12:03:08

+0

@ starshine531感谢您的帮助,它的确被打破了。我回到了我的初步答案,并发现打破它的错字。请参阅http://sqlfiddle.com/#!8/ed7df – didierc 2013-03-24 12:26:27

0

SELECT TABLE2.ID从表2可以TABLE1 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,但子查询返回的时候多行不能设置一个值

+1

这是假设是一个答案还是一个问题? – Cyclonecode 2013-03-23 01:06:18

+0

@Krister Andersson我解释下面的原因。这是一个没有问题的答案 – 2013-03-23 01:08:05

+0

@CodingInCircles你检查我的答案 – 2013-03-23 01:13:10

2

好吧,这听起来像你的名字字段不是唯一的。你的子查询匹配多行,所以你要么需要找到一个唯一的ID匹配除了姓名,否则,如果你想只取子查询的第一个结果做到这一点:

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

+0

另外,您应该知道子查询效率低下。大多数子查询可以用左连接或其他类型的连接替换。尽可能避免子查询。 – starshine531 2013-03-23 04:56:27

+0

我试过这个,它运行没有任何错误,除了它不会改变任何东西。大约需要2-3分钟才能在table1中运行约1100行,在table2中运行约150k行,并返回受影响和匹配的行数以及警告的数量(0),但是当我查看table1时,没有任何更改。为什么会这样呢? – CodingInCircles 2013-03-24 02:07:12

+0

尝试运行子查询SELECT TABLE2.ID FROM TABLE2,TABLE1 WHERE TABLE1.NAME = TABLE2.NAME LIMIT 1'。也许你得到的结果与你期望的不同。也可以运行没有LIMIT 1的查询来查看您得到的结果。这可能会给你一些线索,看看发生了什么。 正如我所提到的,子查询效率低下,因此很慢。你确实为这些表设置了主键,是的? – starshine531 2013-03-24 03:05:33