2016-10-20 158 views
0

我必须更新MySQL数据库中的表中的多个行,其中查找要更新的行的条件位于同一个表中。如何在FROM子句中的MySQL中的UPDATE查询中使用子查询

例如,我有一个名为“cdrs”的表。表中有一列叫做“tf”,这是我必须更新的那一列。 具有更新或不更新行的条件是“calltype”。 “recordId”是该表的关键。 我使用的查询,这是一个:

UPDATE cdrs 
SET tf = 1 
WHERE recordId in (SELECT recordId from cdrs WHERE calltype = 11); 

但与此查询,我得到以下错误:

Error Code: 1093. You can't specify target table 'cdrs' for update in FROM clause.

我搜索这里,说实话,发现很多帖子在这个问题上但是当所有表都在SET子句中时,它们都处理这个问题,而不是WHERE。 例如,我发现这个职位: MySQL Error 1093 - Can't specify target table for update in FROM clause

我试图用这个想法,但没有成功。

有没有人有同样的问题,并找到了解决办法? 我很感谢解决这个问题的任何帮助。

非常感谢你, 若昂·保罗

+1

是不是很简单了很多做'UPDATE的CDR SET TF = 1,其中CALLTYPE = 11'? – apokryfos

+0

嗨@apokryfos, 是的,这是真的!我坚持这个想法,即必须使用主键进行更新,但使用calltype,从逻辑上讲是合理的。 非常感谢! –

回答

0

通用问题的答案是,你不能用同一个表中的子查询比你

UPDATE cdrs 
SET tf = 1 
WHERE recordId in (SELECT recordId from (SELECT * FROM cdrs) innerCdrs WHERE calltype = 11); 

这工作,因为不是使用表cdrs你:做主更新查询,您可以通过做一招解决这个问题根据查询SELECT * FROM cdrs创建临时表。

然而,在你的情况下,你的查询可以大大简化到

UPDATE cdrs SET tf=1 WHERE calltype=11 
+0

谢谢。 我喜欢这个答案,因为它也增加了关于临时表的信息,当发生同样类型的问题时可能会有用。 –

3

你可以做简单的要求:

UPDATE cdrs SET tf = 1 WHERE calltype = 11; 
+0

非常感谢。 这真的很有道理,正如其他答案也指出的那样。 我只想使用主键在表中进行更新。 非常感谢。 –

0

这很简单,只要UPDATE cdrs SET tf = 1 WHERE calltype = 11;

+0

非常感谢您的回答。 现在,有一些答案指出了同样的事情,我想为什么我只考虑主键作为更新的参考。 此致敬礼。 –

相关问题