Объединить вычисленные данные из двух таблиц обратно в одну из них

0

У меня следующая ситуация (как приведенный пример). Две таблицы, Measures1 и Measures2, каждая из которых хранит идентификатор, вес в граммах и, при необходимости, объем в жидких единицах. (В действительности Measures1 содержит много других данных, которые здесь неактуальны)

Содержание Measures1:

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

Содержание Measures2:

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

В этих таблицах описываются эквивалентные веса и объемы вещества. Например. 10 жидких унций вещества 1 весит 75 грамм. Идентификаторы связаны: ID 1 в Measures1 является тем же самым веществом, что и ID 1 в Measures2.

То, что я хочу сделать, это заполнить тома NULL в Measures1, используя информацию в Measures2, но сохраняя весовые значения от Measures1 (тогда, в конечном счете, я могу отказаться от таблицы Measures2 поскольку он будет избыточным). Для простоты предположим, что все тома в Measures1 равны NULL, а все тома в Measures2 не являются.

Я могу вычислить тома, которые хочу заполнить, следующим запросом:

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

Производство:

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

Но я не понимаю, как реально вставить эти вычисленные значения в таблицу Measures1.

Предпочтительно, я хотел бы иметь возможность сделать это с помощью одного запроса, вместо того, чтобы записывать script или хранимую процедуру, которая выполняет итерацию через каждый идентификатор в Measures1. Но даже тогда я беспокоюсь, что это может быть невозможно, потому что в документации по MySQL говорится, что вы не можете использовать таблицу в запросе UPDATE и подзапросе SELECT в то же время, и я думаю, что любое решение должно сделайте это.

Я знаю, что одним обходным решением может быть создание новой таблицы с результатами вышеуказанного запроса (также выбор всех других нетопливных полей в Measures1), а затем отбросить обе таблицы и заменить Measures1 на недавно созданная таблица, но мне было интересно, есть ли лучший способ сделать это, что мне не хватает.

Теги:

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню