使用同一表中另一行的数据更新行

时间:2011-04-07 00:12:17

标签: mysql

我有一张看起来像这样的桌子

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

我正在寻找一种方法来更新值'Test2'和'Test',其中来自'VALUE'列中其他行的数据具有相同的'NAME'(这里的ID不是唯一的,复合键ID和NAME使行唯一)。例如,我正在寻找的输出是:

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

如果它在另一个表中我会没事的,但是我对如何使用相同的NAME值引用当前表中的不同行感到茫然。

更新

修改manji查询后,下面是我用于工作解决方案的查询。谢谢大家!

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

5 个答案:

答案 0 :(得分:69)

试试这个:

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

答案 1 :(得分:15)

这是我的去处:

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;

编辑:删除了多余的t1.id != t2.id条件。

答案 2 :(得分: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
                )

答案 3 :(得分: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

答案 4 :(得分:0)

如果您只需要插入包含另一行数据的新行,

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