2010-06-11 1 views
0

J'ai la situation suivante (en tant qu'exemple réduit). Deux tables, Measures1 et Measures2, dont chacune stocke un identifiant, un poids en grammes, et éventuellement un volume en onces fluides. (En réalité, Measures1 a beaucoup d'autres données non pertinentes ici)Fusionner les données calculées à partir de deux tables dans l'un d'eux

Contenu de Measures1:

+----+----------+--------+ 
| ID | Weight | Volume | 
+----+----------+--------+ 
| 1 | 100.0000 | NULL | 
| 2 | 200.0000 | NULL | 
| 3 | 150.0000 | NULL | 
| 4 | 325.0000 | NULL | 
+----+----------+--------+ 

Contenu du Measures2:

+----+----------+----------+ 
| ID | Weight | Volume | 
+----+----------+----------+ 
| 1 | 75.0000 | 10.0000 | 
| 2 | 400.0000 | 64.0000 | 
| 3 | 100.0000 | 22.0000 | 
| 4 | 500.0000 | 100.0000 | 
+----+----------+----------+ 

Ces tableaux décrivent des poids et des volumes équivalents d'une substance. Par exemple. 10 onces liquides de la substance 1 pèse 75 grammes. Les ID sont liés: ID 1 dans Measures1 est la même substance que ID 1 dans Measures2.

Ce que je veux faire est de remplir les NULL volumes Measures1 en utilisant les informations contenues dans Measures2, mais en gardant les poids de Measures1 (puis, en fin de compte, je peux laisser tomber la table Measures2, car il sera redondant). Par souci de simplicité, supposons que tous les volumes dans Measures1 sont NULL et tous les volumes dans Measures2 ne le sont pas.

Je peux calculer les volumes que je veux remplir avec la requête suivante:

SELECT Measures1.ID, Measures1.Weight, 
     (Measures2.Volume * (Measures1.Weight/Measures2.Weight)) 
     AS DesiredVolume 
FROM Measures1 JOIN Measures2 ON Measures1.ID = Measures2.ID; 

Production:

+----+----------+-----------------+ 
| ID | Weight | DesiredVolume | 
+----+----------+-----------------+ 
| 4 | 325.0000 | 65.000000000000 | 
| 3 | 150.0000 | 33.000000000000 | 
| 2 | 200.0000 | 32.000000000000 | 
| 1 | 100.0000 | 13.333333333333 | 
+----+----------+-----------------+ 

Mais je suis à une perte pour savoir comment insérer réellement ces valeurs calculées en le tableau Measures1.

De préférence, je voudrais être en mesure de le faire avec une seule requête, plutôt que d'écrire un script ou une procédure stockée qui itère à travers chaque ID Measures1. Mais même alors, je crains que cela ne soit pas possible parce que la documentation MySQL dit que vous ne pouvez pas utiliser une table dans une requête UPDATE et une sous-requête SELECT en même temps, et je pense que toute solution devrait le faire.

Je sais que une solution de contournement pourrait être de créer une nouvelle table avec les résultats de la requête ci-dessus (sélection aussi tous les autres domaines non volume dans Measures1), puis déposer les deux tables et remplacer Measures1 avec le nouvellement créé table, mais je me demandais s'il y avait une meilleure façon de le faire que je suis manquant.

Répondre

0
UPDATE Measures1 
SET Volume = (Measures2.Volume * (Measures1.Weight/Measures2.Weight)) 
FROM Measures1 JOIN Measures2 
ON Measures1.ID = Measures2.ID; 
Questions connexes