2011-04-07 79 views
46

我有一個表,它看起來像這樣更新一行在同一個表的另一行數據

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

我正在尋找一種方式來更新值「的Test2」和「測試」與'VALUE'列中其他行的數據具有相同的'NAME'(這裏的ID不是唯一的,ID和NAME的複合鍵使行成爲唯一的)。例如,我在尋找的輸出是:

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

如果是在另一張表,我會很好,但我不知所措我,我怎麼可以在當前中引用不同的行表具有相同的NAME值。

更新

修改曼吉查詢後,下面是我用於工作解決方案查詢。謝謝大家!

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

東西小白,但我敢肯定,這可以使用臨時表來完成。將值爲空的名稱選擇到臨時表中,然後填入值,然後將這些值填回到名稱匹配的原始表中。 – bdares 2011-04-07 00:23:04

+1

您可以更具體地瞭解他們如何從其他行獲取數據嗎?從這個例子中,看起來好像你想給所有具有相同NAME的人都有相同的值,這是正確的嗎?身份證在這裏有重要嗎? – 2011-04-07 00:24:00

+0

@Gustav,我找到了一個解決方案(見下文),但是,是的,目的是讓同一個名稱的相同列具有相同的值。 ID是不相關的 – slick 2011-04-10 00:45:58

回答

59

試試這個:

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

是否有可能在mysql中從當前正在更新的表中進行選擇? – zerkms 2011-04-07 00:30:37

+2

不,這是不可能的,但我從我從更新目標創建的臨時表「t1」中選擇。 – manji 2011-04-07 00:33:46

+0

好吧,我仍然認爲你的查詢會失敗。你試過了嗎? – zerkms 2011-04-07 00:36:14

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

'Update Test2'子句中的'Test2'是什麼? – zerkms 2011-04-07 00:30:03

+0

@zerkms - 意識到他並不是在談論從另一個表更新表,而是更新同一個表。 – Thomas 2011-04-07 00:34:02

+0

在manji的回答中,我認爲這是行不通的(因爲你選擇了你正在更新的同一張表) – zerkms 2011-04-07 00:36:59

13

這裏是我去:

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條件。

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

如果你只需要插入新行與另一行數據,

insert into ORDER_ITEM select * from ORDER_ITEM where ITEM_NUMBER =123; 
相關問題