2010-11-18 36 views
0

我试图做到这一点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

回答

0

因为MySQL的特点,你会得到这是更快的唯一方法是将其分成两个声明。首先,获取最大值,然后在更新中使用它。这是一个已知的黑客行为,并且,afaik在一个声明中没有“干净利落”的方式。

-1

这工作:

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

不,它没有。以下是错误: '您无法在FROM子句中指定目标表'temp_svn1'进行更新' – Gaurav 2010-11-18 19:17:49

+0

对不起,我在ms sql中进行了测试。 – 2010-11-18 19:25:20

0

由于您的子查询只是返回一个值,您可以在两个阶段执行查询。将max(date)选择到服务器端变量中,然后在外部查询中重新使用该变量。当然,这会把事情分解成两个查询,它不再是原子的。但通过适当的交易/锁定,这将变得毫无意义。