使用同一个表上的子查询进行更新

时间:2010-11-18 19:01:29

标签: sql mysql

我试图实现这个query1

UPDATE temp_svn1 t set closedate=(select max(date) from temp_svn1 p where p.id=t.id

显然MySQL不允许这样的查询。所以我使用内部联接来提出这个查询,但这太慢了。如何为此编写更好的查询?或者如何实现query 1的逻辑?

UPDATE temp_svn1 AS out INNER JOIN (select id, close from temp_svn1 T inner join (select id as cat, max(date) as close from temp_svn1 group by cat) as in where T.id = in.cat group by id ) as result ON out.id = result.id SET out.closedate = result.close

3 个答案:

答案 0 :(得分:0)

由于mysql的特殊性,你要让它更快的唯一方法是将它分成两个语句。首先,获取最大值,然后在更新中使用它。这是一个已知的黑客攻击,而且,在一个声明中,没有“整洁”的方式。

答案 1 :(得分:0)

由于您的子查询只返回一个值,因此您可以分两个阶段进行查询。选择服务器端变量的max(date),然后在外部查询中重用该变量。当然,这会将事情分解为两个查询,它将不再是原子的。但是通过适当的交易/锁定,这就没有用了。

答案 2 :(得分:-1)

这有效:

UPDATE temp_svn1
set closedate = (select max(date) from temp_svn1 p where p.id = temp_svn1.id)