Вставить новую строку с данными, вычисленными из других строк - PullRequest
5 голосов
/ 16 мая 2010

Предположим, у меня есть таблица MySQL с именем MyTable, которая выглядит следующим образом:

+----+------+-------+
| Id | Type | Value |
+----+------+-------+
|  0 | A    |     1 |
|  0 | B    |     1 |
|  1 | A    |     2 |
|  1 | B    |     3 |
|  2 | A    |     5 |
|  2 | B    |     8 |
+----+------+-------+

И для каждого Id я хочу вставить новую строку с типом C, чей Value является суммой значений типа A и B для строк того же Id , Первичный ключ в этой таблице - (Id, Type), поэтому нет вопроса дублирования идентификатора, пары типов.

Я могу создать нужные строки с помощью этого запроса:

SELECT MyTable_A.Id AS Id, 'C' AS Type, (A_Val + B_Val) AS Value FROM 
       (SELECT Id, Value AS A_Val FROM MyTable WHERE Type='A') AS MyTable_A
  JOIN (SELECT Id, Value AS B_Val FROM MyTable WHERE Type='B') AS MyTable_B
    ON MyTable_A.Id = MyTable_B.Id

Предоставление:

+----+------+-------+
| Id | Type | Value |
+----+------+-------+
|  0 | C    |     2 |
|  1 | C    |     5 |
|  2 | C    |    13 |
+----+------+-------+

Но вопрос в следующем: как использовать этот результат для вставки сгенерированных строк типа C в MyTable?

Есть ли относительно простой способ сделать это с помощью запроса, или мне нужно написать хранимую процедуру? И если последнее, руководство будет полезным, так как я не слишком хорошо разбираюсь в них.

Ответы [ 2 ]

4 голосов
/ 16 мая 2010

Вы можете просто добавить этот выбор (слегка измененный, как в «вам не нужны пункты as») на вставку. Например:

insert into MyTable (Id,Type,Value)
    select MyTable_A.Id, 'C', (A_Val + B_Val) from ...

при условии, что ваш запрос действительно правильный - я не оцениваю это: -)

В качестве дополнительного примера,

insert into MyTable (Id,Type,Value)
    select Id+1000, 'C', Value from MyTable where Type = 'A'

добавит следующие строки:

+------+------+-------+
| Id   | Type | Value |
+------+------+-------+
| 1000 | C    |     1 |
| 1001 | C    |     2 |
| 1002 | C    |     5 |
+------+------+-------+
2 голосов
/ 16 мая 2010

Просто добавьте следующую строку перед оператором select:

INSERT MyTable (Id, Type, Value)
...