可能消除;不在「;从MySQL删除子查询?
我有两个InnoDB表,我们称它们为tableD和tableC。TableD有一个名为id的varchar主键行。TableC有一个名为seq的BIGINT主键行和另一个名为f_id的varchar列。f_id的值不是唯一的,对应于TableC中的id列 我试图实现的是从tableD中删除所有行,除了那些与tableC中任何行中的f_id列匹配且seq column值大于特定值的行 以下是我现在的疑问:可能消除;不在「;从MySQL删除子查询?,mysql,optimization,subquery,mariadb,Mysql,Optimization,Subquery,Mariadb,我有两个InnoDB表,我们称它们为tableD和tableC。TableD有一个名为id的varchar主键行。TableC有一个名为seq的BIGINT主键行和另一个名为f_id的varchar列。f_id的值不是唯一的,对应于TableC中的id列 我试图实现的是从tableD中删除所有行,除了那些与tableC中任何行中的f_id列匹配且seq column值大于特定值的行 以下是我现在的疑问: delete d from tableD as d where d.id not in (
delete d from tableD as d
where d.id not in (
select c.f_id from tableC as c
where seq>1401399893702598
);
在执行此任务时,此查询将针对大型表运行,在10s的GB范围内,有数百万行。它不需要是实时的,但越快越好。所以我试图找出是否有可能消除这个子查询,可能用一个连接来代替它。我认为我必须将其保留为单个查询,因为行可以随时添加到任何一个表中,并且不应出于任何原因删除这些新行
到目前为止,我所有的尝试都失败了。我得到的已关闭查询是以下查询,它只删除我要保留的行,并保留所有其他行:
delete d from tableD as d
left join tableC as c on d.id=c.f_id
where c.seq>1401399893702598;
我正在使用MySQL 5.6。您需要将
seq
上的条件移动到on
子句,并在where
子句中测试是否没有匹配项:
delete d
from tableD as d left join
tableC as c
on d.id = c.f_id and c.seq > 1401399893702598
where c.f_id is null;