Merge computed data from two tables back into one of them

Posted by Tyler McHenry on Stack Overflow See other posts from Stack Overflow or by Tyler McHenry
Published on 2010-06-11T20:37:24Z Indexed on 2010/06/11 20:42 UTC
Read the original article Hit count: 235

Filed under:
|

I have the following situation (as a reduced example). Two tables, Measures1 and Measures2, each of which store an ID, a Weight in grams, and optionally a Volume in fluid onces. (In reality, Measures1 has a good deal of other data that is irrelevant here)

Contents of Measures1:

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

Contents of Measures2:

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

These tables describe equivalent weights and volumes of a substance. E.g. 10 fluid ounces of substance 1 weighs 75 grams. The IDs are related: ID 1 in Measures1 is the same substance as ID 1 in Measures2.

What I want to do is fill in the NULL volumes in Measures1 using the information in Measures2, but keeping the weights from Measures1 (then, ultimately, I can drop the Measures2 table, as it will be redundant). For the sake of simplicity, assume that all volumes in Measures1 are NULL and all volumes in Measures2 are not.

I can compute the volumes I want to fill in with the following query:

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

Producing:

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

But I am at a loss for how to actually insert these computed values into the Measures1 table.

Preferably, I would like to be able to do it with a single query, rather than writing a script or stored procedure that iterates through every ID in Measures1. But even then I am worried that this might not be possible because the MySQL documentation says that you can't use a table in an UPDATE query and a SELECT subquery at the same time, and I think any solution would need to do that.

I know that one workaround might be to create a new table with the results of the above query (also selecting all of the other non-Volume fields in Measures1) and then drop both tables and replace Measures1 with the newly-created table, but I was wondering if there was any better way to do it that I am missing.

© Stack Overflow or respective owner

Related posts about sql

Related posts about mysql