MySQL脚本从表中删除某些行

时间:2014-03-27 12:37:36

标签: mysql sql

我有一个具有以下结构的表:

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和MONTH的每种可能组合。

如果该组合有两行(例如上面的行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

非常感谢任何帮助

1 个答案:

答案 0 :(得分: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行的规则。

您可以使用delete

将其用于left outer join
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;