2014-03-27 25 views
0

刪除某些行我有以下結構的表:MySQL的腳本從表

ID | FK_1 | FK_2 | MONTH | STATE 

12 171  26  4 APPROVED 
13 171  26  4 SUPER_APPROVED 
14 56  32  4 APPROVED 
15 45  34  4 SUPER_APPROVED 
16 45  34  4 APPROVED 
17 22  65  4 REJECTED 

我需要刪除重複的行,這樣,只有一個排有FOREIGN_KEY_1,FOREIGN_KEY_2和月份的每個可能的組合。

如果該組合有兩行(例如上面的行ID 12 & 13或15 & 16),我只想保留具有狀態SUPER_APPROVED的行。

腳本已運行我希望下面的數據是在表後(基於示例數據上面):

ID | FK_1 | FK_2 | MONTH | STATE 

13 171  26  4 SUPER_APPROVED 
14 56  32  4 APPROVED 
15 45  34  4 SUPER_APPROVED 
17 22  65  4 REJECTED 

任何幫助,將不勝感激

+0

你嘗試過什麼到目前爲止?請顯示您的努力,以便我們可以改進您的方法 –

+0

這就是爲什麼最好將數據作爲狀態存儲在數值中。獲取Max()或Min()比通過值篩選行要容易得多。 – MikkaRin

回答

3

的想法是生成你想保留的行的列表。這裏是做一個查詢:

 select FK_1, FK_2, MONTH, 
      coalesce(min(case when state = 'SUPER_APPROVED' then id end), 
         min(id) 
        ) as id 
     from table t 
     group by FK_1, FK_2, MONTH; 

注意,當有1排爲組合,那麼該行的ID是id。否則,它遵循您的規則,喜歡SUPER_APPROVED行。

您可以通過使用left outer join使用了delete

delete t 
    from table t left outer join 
     (select FK_1, FK_2, MONTH, 
       coalesce(min(case when state = 'SUPER_APPROVED' then id end), 
          min(id) 
         ) as id 
      from table t 
      group by FK_1, FK_2, MONTH 
     ) as tokeep 
     on t.id = tokeep.id 
    where tokeep.id is null; 
+0

@ PiX06。 。 。 'table'只是爲了表名的通用佔位符。 –