2010-11-18 17 views
0

Ich habe versucht, dies zu erreichen query1:Aktualisieren mit Sub-Abfrage auf derselben Tabelle

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

Anscheinend MySQL nicht solche Abfragen ermöglichen. Also habe ich diese Abfrage mit inneren Joins erstellt, aber das ist zu langsam. Wie kann ich eine bessere Abfrage dafür schreiben? ODER Wie kann ich die Logik von query 1 erreichen?

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

Antwort

0

Wegen MySQL-Besonderheiten der einzige Weg Sie gehen diese schneller zu bekommen, ist es in zwei Anweisungen zu spalten. Holen Sie zuerst das Maximum und verwenden Sie es dann in einem Update. Dies ist ein bekannter Hack, und, afaik, gibt es keinen "sauberen" Weg, dies in einer einzigen Aussage zu tun.

-1

Dies funktioniert:

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

Nein, tut es nicht. Hier ist der Fehler: 'Sie können nicht die Zieltabelle 'temp_svn1' für die Aktualisierung in FROM-Klausel ' – Gaurav

+0

Sorry, ich habe in ms sql getestet. –

0

Da Ihre Unterabfrage nur einen einzelnen Wert zurückgibt, können Sie die Abfrage in zwei Schritten durchführen. Wählen Sie das Maximum (Datum) in einer serverseitigen Variablen und verwenden Sie diese Variable dann in der äußeren Abfrage erneut. Natürlich werden dadurch zwei Fragen gelöst und es wird nicht mehr atomar sein. Aber mit entsprechenden Transaktionen/Sperren, das wird strittig.

Verwandte Themen