Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于从表中删除某些行的MySQL脚本_Mysql_Sql - Fatal编程技术网

用于从表中删除某些行的MySQL脚本

用于从表中删除某些行的MySQL脚本,mysql,sql,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 R

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

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
我需要删除重复的行,以便只有一行具有外键1、外键2和月份的每个可能组合

如果该组合有两行(如上面的行ID12&13或15&16),我只想保留州SUPER_批准的行

脚本运行后,我希望表中会出现以下数据(基于上面的示例数据):


任何帮助都将不胜感激

我们的想法是生成一个要保留的行列表。下面是一个查询,用于:

      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;
请注意,当组合有一行时,该行的id位于
id
中。否则,它将遵循您的规则,优先选择
SUPER\u APPROVED

您可以通过使用
左外连接将其用于
删除

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;

其思想是生成一个要保留的行列表。下面是一个查询,用于:

      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;
请注意,当组合有一行时,该行的id位于
id
中。否则,它将遵循您的规则,优先选择
SUPER\u APPROVED

您可以通过使用
左外连接将其用于
删除

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;

其思想是生成一个要保留的行列表。下面是一个查询,用于:

      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;
请注意,当组合有一行时,该行的id位于
id
中。否则,它将遵循您的规则,优先选择
SUPER\u APPROVED

您可以通过使用
左外连接将其用于
删除

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;

其思想是生成一个要保留的行列表。下面是一个查询,用于:

      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;
请注意,当组合有一行时,该行的id位于
id
中。否则,它将遵循您的规则,优先选择
SUPER\u APPROVED

您可以通过使用
左外连接将其用于
删除

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;

到目前为止你试过什么吗?请展示您的努力,以便我们能够展示您方法的改进,这就是为什么最好将数据存储为数值状态。Get Max()或Min()比按值筛选行容易得多。到目前为止,您尝试过什么吗?请展示您的努力,以便我们能够展示您方法的改进,这就是为什么最好将数据存储为数值状态。Get Max()或Min()比按值筛选行容易得多。到目前为止,您尝试过什么吗?请展示您的努力,以便我们能够展示您方法的改进,这就是为什么最好将数据存储为数值状态。Get Max()或Min()比按值筛选行容易得多。到目前为止,您尝试过什么吗?请展示您的努力,以便我们能够展示您方法的改进,这就是为什么最好将数据存储为数值状态。Get Max()或Min()比按值筛选行容易得多。@PiX06<代码>表格
只是用来作为表格名称的通用占位符。@PiX06<代码>表格
只是用来作为表格名称的通用占位符。@PiX06<代码>表格
只是用来作为表格名称的通用占位符。@PiX06
table
只是用来作为表名的通用占位符。