2010-05-16 46 views
5

假设我有一个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是类型AB值的总和,这些值与Id相同。该表的主键是(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

是否有一个相对简单的方法来做到这一点与查询,或者我需要编写一个存储过程?如果是后者,指导将会有所帮助,因为我对他们不太了解。

+0

这将取消您的数据标准化。你为什么想这样做? A和B的变化会发生什么?有人可以修改C的吗? – 2010-05-16 13:48:28

+0

需要这样做的原因是,虽然'C'被定义为'A + B',并且表格中的所有条目当前具有'A'和'B'值,那么将来只有'C'被知道的条目并且无法确定“A”和“B”组件的细分。我意识到这意味着我将不得不实现外部验证逻辑,以确保'C = A + B'用于插入和更新'Id',其中'A'和'B' *是已知的。 – 2010-05-16 13:52:53

回答

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 | 
+------+------+-------+ 
+0

优秀!简单,甚至先发制人地回答我的后续问题:“如果表中还有其他列需要采用默认值,那该怎么办?” – 2010-05-16 14:11:48

2

你的SELECT语句之前,只需添加以下行:

INSERT MyTable (Id, Type, Value)