插入新行并使用其他行的数据计算填充。

5
假设我有一个名为MyTable的MySQL表,它看起来像这样:
+----+------+-------+
| Id | Type | Value |
+----+------+-------+
|  0 | A    |     1 |
|  0 | B    |     1 |
|  1 | A    |     2 |
|  1 | B    |     3 |
|  2 | A    |     5 |
|  2 | B    |     8 |
+----+------+-------+

对于每个Id,我想插入一行新的类型为C,其Value是相同Id下类型AB的值之和。该表的主键是(Id, Type),因此不会出现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中?
是否有一个相对简单的方法可以用查询来完成,还是我需要编写存储过程?如果是后者,指导会很有帮助,因为我对它们不太熟悉。

这将使您的数据去规范化。为什么要这样做?当A和B发生变化时会发生什么?有人可以修改C吗? - Marcelo Cantos
这是必需的原因是,虽然C被定义为A+B,并且表中所有条目当前都有AB值,但将来可能会出现仅知道C且无法确定其分解为AB组件的条目。我意识到这意味着我将不得不实现外部验证逻辑,以确保在已知ABId上插入和更新时,C = A+B - Tyler McHenry
2个回答

4
您只需将该选择器(略作修改,如“您不需要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 |
+------+------+-------+

太好了!简单明了,甚至提前回答了我的后续问题:“如果表中还有其他列,我想使用它们的默认值怎么办?” - Tyler McHenry

2

在你的选择语句之前添加以下行:

INSERT MyTable (Id, Type, Value)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接