2010-11-18 6 views
0

je tentais d'atteindre cet query1:Mise à jour avec sous requête sur la même table

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

Apparemment, MySQL ne permet pas de telles requêtes. Donc je suis venu avec cette requête en utilisant des jointures internes, mais c'est trop lent. Comment puis-je écrire une meilleure requête pour cela? OU Comment puis-je atteindre la logique de 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

Répondre

0

En raison de particularités mysql la seule façon que vous allez obtenir que ce soit plus rapide est de scinder en deux déclarations. Tout d'abord, récupérez le maximum, puis utilisez-le dans une mise à jour. C'est un hack connu, et, afaik, il n'y a pas une façon plus simple de le faire dans une seule déclaration.

-1

Cela fonctionne:

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

Non, ce n'est pas le cas. Voici l'erreur: 'Vous ne pouvez pas spécifier la table cible 'temp_svn1' pour la mise à jour dans la clause FROM' – Gaurav

+0

Désolé, j'ai testé en MS SQL. –

0

Étant donné que votre sous-requête ne renvoie qu'une seule valeur, vous pouvez effectuer la requête en deux étapes. Sélectionnez la valeur max (date) dans une variable côté serveur, puis réutilisez cette variable dans la requête externe. Bien sûr, cela divise les choses en deux requêtes et ce ne sera plus atomique. Mais avec des transactions/verrous appropriés, cela devient discutable.

Questions connexes