插入包含从其他行计算的数据的新行

Tyl*_*nry 5 mysql insert-query

假设我有一个名为MyTable的MySQL表,它看起来像这样:

+----+------+-------+
| Id | Type | Value |
+----+------+-------+
|  0 | A    |     1 |
|  0 | B    |     1 |
|  1 | A    |     2 |
|  1 | B    |     3 |
|  2 | A    |     5 |
|  2 | B    |     8 |
+----+------+-------+
Run Code Online (Sandbox Code Playgroud)

并且,对于每个Id,我想插入一个新行,C其类型Value是行的类型AB值的总和Id.这个表上的主键是(Id, Type),所以不存在重复ID,类型对的问题.

我可以使用此查询创建我想要的行:

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
Run Code Online (Sandbox Code Playgroud)

赠送:

+----+------+-------+
| Id | Type | Value |
+----+------+-------+
|  0 | C    |     2 |
|  1 | C    |     5 |
|  2 | C    |    13 |
+----+------+-------+
Run Code Online (Sandbox Code Playgroud)

但问题是:如何使用此结果将生成的类型C行插入MyTable

是否有一种相对简单的方法来执行查询,或者我是否需要编写存储过程?如果是后者,指导会有所帮助,因为我不太熟悉它们.

pax*_*blo 4

您可以将该选择(稍微修改为“您不需要子句as”)附加到插入中。例如:

insert into MyTable (Id,Type,Value)
    select MyTable_A.Id, 'C', (A_Val + B_Val) from ...
Run Code Online (Sandbox Code Playgroud)

假设您的查询实际上是正确的 - 我对此不做任何评估:-)

进一步举例来说,

insert into MyTable (Id,Type,Value)
    select Id+1000, 'C', Value from MyTable where Type = 'A'
Run Code Online (Sandbox Code Playgroud)

将添加以下行:

+------+------+-------+
| Id   | Type | Value |
+------+------+-------+
| 1000 | C    |     1 |
| 1001 | C    |     2 |
| 1002 | C    |     5 |
+------+------+-------+
Run Code Online (Sandbox Code Playgroud)