2010-02-23 5 views

Répondre

1

Voulez-vous dire que vous souhaitez mettre à jour la table où champ1, champ2 et field3 sont dans l'ensemble retourné par l'instruction select?

par ex.

update table, 
    (select field1, field2, field3 
     FROM table WHERE field1= 5 AND field_flag =1 
     GROUP BY field1, field2, field3 limit 1000) temp 
set table.field_flag = 99 
where table.field1=temp.field1 and table.field2=temp.field2 and table.field3 = temp.field3 

Notez que la mise à jour peut mettre à jour plusieurs milliers de lignes.

Une table temporaire peut être utilisé aussi:

create temporary table temptab as 
select field1, field2, field3 
FROM table WHERE field1= 5 AND field_flag =1 
GROUP BY field1, field2, field3 limit 1000 

update table, 
     temptab temp 
set table.field_flag = 99 
where table.field1=temp.field1 and table.field2=temp.field2 and table.field3 = temp.field3 

Ceci a l'avantage que temptab peut être utilisé plus tard, et que les index peuvent être ajoutés pour accélérer la mise à jour:

create index on temptab (field1, field2, field3); 
+0

Oui, c'est ce que je voulais. Est-il possible de retourner aussi le résultat de la sélection, donc je ne vais pas avoir à interroger deux fois? une fois pour la sélection et une fois pour la mise à jour du drapeau. – Nir

+0

Vous pouvez effectuer votre sélection dans une table temporaire et l'utiliser. créer table temporaire temptab comme sélectionner field1, field2, ... mettre à jour la table, temptab définir table.field = 99 où table.field1 = temptab.field1 et ... – Martin

-1

Que diriez-vous:

UPDATE table SET field_flag = <newvalue> 
WHERE idfield IN (
    SELECT idfield 
    FROM table 
    WHERE <conditions> 
) 
+0

Merci . Mais il n'y a pas un seul idfield. – Nir

Questions connexes