2010-11-18 34 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)選擇到服務器端變量中,然後在外部查詢中重新使用該變量。當然,這會把事情分解成兩個查詢,它不再是原子的。但通過適當的交易/鎖定,這將變得毫無意義。