2010-05-16 10 views
5

Supongamos que tengo una tabla de MySQL llamada MiTabla, que se ve así:Insertar nueva fila con los datos calculados a partir de otras filas

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

Y, para cada Id, quiero insertar una nueva fila con el tipo C cuya Value es la suma de los valores de tipo A y B para las filas del mismo Id. La clave principal en esta tabla es (Id, Type), por lo que no hay dudas sobre la duplicación de los pares Id, Tipo.

puedo crear las filas que quiera con esta consulta:

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 

El dar:

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

Pero la cuestión es: ¿Cómo se utiliza este resultado para insertar el generado de tipo C filas en MyTable?

¿Hay una manera relativamente simple de hacer esto con una consulta, o tengo que escribir un procedimiento almacenado? Y si esto último, la orientación sería útil, ya que no estoy muy bien versado en ellos.

+0

Esto desregulará sus datos. ¿Por qué quieres hacer esto? ¿Qué pasará cuando cambien los A y B? ¿Alguien puede modificar las C? –

+0

La razón por la que esto es obligatorio es que mientras 'C' se define como' A + B', y todas las entradas en las tablas tienen actualmente valores 'A' y' B', habrá entradas futuras donde solo se conoce 'C' y donde no hay forma de determinar el desglose en los componentes 'A' y 'B'. Me doy cuenta de que esto significa que tendré que implementar una lógica de validación externa que asegure que 'C = A + B' para inserciones y actualizaciones en' Id's donde 'A' y' B' * son * conocidos. –

Respuesta

4

Usted puede simplemente añadir que seleccione (con ligeras modificaciones como en "que no es necesario as las cláusulas") en un inserto. Por ejemplo:

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

suponiendo que la consulta es realmente correcto - No hago ninguna evaluación de esa :-)

A modo de ejemplo adicional,

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

añadirían las filas siguientes:

+------+------+-------+ 
| Id | Type | Value | 
+------+------+-------+ 
| 1000 | C |  1 | 
| 1001 | C |  2 | 
| 1002 | C |  5 | 
+------+------+-------+ 
+0

¡Excelente! Simple, e incluso preventivamente respondió mi pregunta de seguimiento de "¿Qué pasa si hay otras columnas en la tabla que quiero simplemente tomar sus valores predeterminados?" –

2

Sólo tiene que añadir la siguiente línea antes de que su sentencia de selección:

INSERT MyTable (Id, Type, Value) 
Cuestiones relacionadas