2011-04-07 18 views
46

Tengo una tabla que se ve algo como estofila de actualización con datos de otra fila en la misma mesa

ID | NAME | VALUE | 
---------------------------- 
1 | Test | VALUE1 | 
2 | Test2 | VALUE2 | 
1 | Test2 |   | 
4 | Test |   | 
1 | Test3 | VALUE3 | 

Estoy buscando una manera de actualizar 'Prueba2' y los valores de 'Prueba' con los datos de otras filas en la columna 'VALOR' con el mismo 'NOMBRE' (la ID no es única aquí, una clave compuesta de ID y NAME hacen que una fila sea única). Por ejemplo, la salida que estoy buscando es:

ID | NAME | VALUE | 
---------------------------- 
1 | Test | VALUE1 | 
2 | Test2 | VALUE2 | 
1 | Test2 | VALUE2 | 
4 | Test | VALUE1 | 
1 | Test3 | VALUE3 | 

Si estaba en otra mesa estaría bien, pero estoy en una pérdida en cuanto a cómo puedo hacer referencia a una fila diferente dentro de la corriente tabla con el mismo valor de NAME

actualización

Después de modificar consulta Manji, a continuación es la consulta que utilicé para una solución de trabajo. ¡Gracias a todos!

UPDATE data_table dt1, data_table dt2 
SET dt1.VALUE = dt2.VALUE 
WHERE dt1.NAME = dt2.NAME AND dt1.VALUE = '' AND dt2.VALUE != '' 
+0

Algo de un novato, pero estoy seguro que esto se podría hacer uso de tablas temporales. Seleccione los nombres donde el valor es nulo en una tabla temporal, luego llene los valores, luego llene esos valores nuevamente en la tabla original donde coincide el nombre. – bdares

+1

¿Podría ser más específico en cómo toman datos de otras filas? En el ejemplo, parece que quieres dar a todos los que tienen el mismo NOMBRE el mismo VALOR, ¿es correcto? ¿Importa la identificación aquí? –

+0

@Gustav, encontré una solución (ver abajo) pero sí, la intención es tener las mismas columnas del mismo nombre para tener el mismo valor. ID es irrelevante – slick

Respuesta

59

Prueba esto:

UPDATE data_table t, (SELECT DISTINCT ID, NAME, VALUE 
         FROM data_table 
         WHERE VALUE IS NOT NULL AND VALUE != '') t1 
    SET t.VALUE = t1.VALUE 
WHERE t.ID = t1.ID 
    AND t.NAME = t1.NAME 
+0

¿Es posible en MySQL seleccionar de la tabla que está actualizando actualmente? – zerkms

+2

no, no es posible, pero estoy seleccionando de una tabla temporal 't1' que estoy creando desde el objetivo de actualización. – manji

+0

Bueno, sigo pensando que su consulta fallará. ¿Lo has probado? – zerkms

3
Update MyTable 
Set Value = (
       Select Min(T2.Value) 
       From MyTable As T2 
       Where T2.Id <> MyTable.Id 
        And T2.Name = MyTable.Name 
       ) 
Where (Value Is Null Or Value = '') 
    And Exists (
       Select 1 
       From MyTable As T3 
       Where T3.Id <> MyTable.Id 
        And T3.Name = MyTable.Name 
       ) 
+0

¿Qué es 'Test2' en la cláusula' Update Test2'? – zerkms

+0

@zerkms - Se dio cuenta de que no estaba hablando de actualizar una tabla de otra, sino de actualizar la misma tabla. – Thomas

+0

como en la respuesta de manji, creo que esto no funcionará (ya que está seleccionando la misma tabla que está actualizando) – zerkms

13

Aquí es mi go:

UPDATE test as t1 
    INNER JOIN test as t2 ON 
     t1.NAME = t2.NAME AND 
     t2.value IS NOT NULL 
SET t1.VALUE = t2.VALUE; 

EDITAR: Se ha eliminado superflua t1.id != t2.id condición.

0
UPDATE financialyear 
    SET firstsemfrom = dt2.firstsemfrom, 
     firstsemto = dt2.firstsemto, 
     secondsemfrom = dt2.secondsemfrom, 
     secondsemto = dt2.secondsemto 
    from financialyear dt2 
WHERE financialyear.financialyearkey = 141 
    AND dt2.financialyearkey = 140 
0

Si sólo tiene que insertar una nueva fila con datos de otra fila,

insert into ORDER_ITEM select * from ORDER_ITEM where ITEM_NUMBER =123; 
Cuestiones relacionadas