用于从表中删除某些行的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<代码>表格
只是用来作为表格名称的通用占位符。@PiX06table
只是用来作为表名的通用占位符。