2014-02-17 73 views
4

我想清理MySQL中的一些數據,我不確定它是解決以下問題的最有效方法。我有三列A,B和C.這些經常具有相同的值。如果A & B是相同的或者A & C是相同的,那麼我想用非NULL值填充另一個選項,如果可能的話。乙&Ç不影響值A.例如:MySQL數據清理

------------------- 
|A |B |C | 
------------------- 
|1 |2 |3 | 
|1 |2 |NULL | 
|2 |5 |8 | 
|2 |NULL |8 | 
|3 |NULL |9 | 
|3 |NULL |NULL | 
------------------- 

在上述例子中第2行,列C應與3和4行被填充,B列應5.當我只有兩個選項,我們然後相應填寫。因此,第6行C列應該是9,而第5行B列和第6行B列都保持爲NULL。我如何編寫一個腳本來解決這個問題,如果B或C不是NULL,那麼我們會根據表中的其他值填充它?謝謝。

+0

您可以編寫使用'case'的'update'聲明。我們非常樂意幫助您編寫劇本,但您到目前爲止嘗試過什麼? – Ryan

回答

0

這是一個有點複雜,但你可以在一個update聲明中做到這一點:

update table t left outer join 
     table tc 
     on t.a = tc.a and t.b = tc.b and tc.c is not null left outer join 
     table tb 
     on t.a = tb.a and t.c = tb.c and tb.b is not null 
    set t.c = coalesce(t.c, tc.c), 
     t.b = coalesce(t.b, tb.b); 

該查詢並自聯接根據您指定的規則來發現新的價值。每個連接都帶來了其中一個值。如果有多個匹配行,則選擇幾行中任意一行的任意值。

你可以看到通過運行select第一會發生什麼:

select * 
from table t left outer join 
     table tc 
     on t.a = tc.a and t.b = tc.b and tc.c is not null left outer join 
     table tb 
     on t.a = tb.a and t.c = tb.c and tb.b is not null; 



set c = (case when c is null 
       then (select c from