2010-01-29 4 views
1

Tout d'abord, je sais que cela est impossible à partir de MySQL 5.1.x, il dit donc ici:MySQL UPDATE et SELECT de même table sous-requête

http://dev.mysql.com/doc/refman/5.1/en/update.html

Ce que je demande bien est si Il existe un moyen astucieux d'exécuter une requête en utilisant une table/vue temporaire sans avoir à écrire un script rapide pour faire le travail. Ma requête (ce qui est COMPLÈTEMENT mal et ne fonctionne pas, juste un FYI pour les gens d'essayer ce à la maison) ressemble à ceci:

UPDATE some_table 
set some_col = (SELECT some_othercol 
       from some_table 
       WHERE some_col > some_othercol 
       ); 

Je suis en train de finalement mis some_col à la valeur de some_othercol si sol_col > some_othercol.

Quelle est la meilleure façon de gérer cela sans avoir recours à un script?

EDIT Ma sous-requête renvoie plus d'une ligne!

+1

Qu'est-ce que vous essayez exactement de faire? Cette requête tente de définir la valeur some_col de chaque ligne sur un ensemble de valeurs. Logiquement, que voulez-vous que le résultat final soit? – Aaron

Répondre

0
+0

désolé, je aurais dû ajouter un peu importante que je ne pense pas que l'URL ci-dessus adresses, mes sous-requête renvoie plusieurs lignes – randombits

+0

que même ne font conceptuellement sens? comment pourriez-vous définir la valeur d'un seul champ à quelque chose impliquant plusieurs lignes? la sous-requête est spécifique à la ligne en cours de mise à jour ... si vous avez plusieurs lignes de mise à jour, vous devrez écrire la requête pour que la sous-requête soit exécutée pour chacune d'entre elles. –

2

Je ne suis pas sûr si cela est tout à fait ce que vous essayez de faire, mais peut-être je peux vous montrer quelque chose à vous mettre sur la bonne voie.

UPDATE some_table ST 
SET some_col = (
    SELECT some_col 
    FROM some_table OT 
    WHERE OT.ID = ST.ID 
) 
WHERE ST.some_col > 2 

qui fixeront some_col à sa propre valeur, mais seulement quand some_col est déjà supérieure à 2. Je sais que cela ne fait rien, mais il montre un concept qui peut être plus proche de ce que vous cherchez pour. Si vous donnez plus de détails sur ce que vous allez faire, je peux vous aider à trouver une solution plus proche de ce dont vous avez besoin.

+2

Je pense que cela va aussi lancer une erreur dans MySQL, car sous-sélection avec la même table que celui qui est mis à jour –

3

Je ne comprends pas vraiment pourquoi vous avez besoin d'un sous-requête. Cela ne fait-il pas ce que vous voulez ?:

UPDATE some_table 
SET some_col = some_othercol 
WHERE some_col > some_othercol