У меня следующая ситуация (как приведенный пример). Две таблицы, 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
на недавно созданная таблица, но мне было интересно, есть ли лучший способ сделать это, что мне не хватает.
UPDATE Measures1
SET Volume = (Measures2.Volume * (Measures1.Weight / Measures2.Weight))
FROM Measures1 JOIN Measures2
ON Measures1.ID = Measures2.ID;