限制使用非查询检查的行 - SQL

时间:2016-02-27 17:20:36

标签: mysql sql

所以我有2张桌子。 {350}行和TableA的{​​{1}}只包含TableB应具有的有效数据。所以我需要清除TableA中的旧数据。

如果TableA不是那么大,那么这个查询会很棒。

Table A

所以我需要做的是限制DELETE FROM TableA where MLS NOT IN (SELECT LIST_3 FROM TableB); 中检查的行数。而不是从TableA检查350K记录,我希望它检查100例如。

我无法弄清楚如何...这不起作用,因为它只限制删除但未检查的行数。它可以检查500行并删除100.我希望它检查100并删除许多不在TableA

TableB

2 个答案:

答案 0 :(得分:1)

如果TableA有主键,则可以执行以下操作:

DELETE a
    FROM TableA a JOIN
         (SELECT a2.id
          FROM TableA a2
          LIMIT 100  -- should have an order by with limit
         ) a2
         ON a.id = a2.id
    WHERE NOT EXISTS (SELECT 1 FROM TableB b WHERE b.List_3 = a.MLS);

注意:

  • 即使使用子查询,使用主键的连接也应该非常快。
  • 我将NOT IN更改为NOT EXISTS。当存在NULL值时,后者具有更直观的行为。
  • 您应始终将ORDER BYLIMIT一起使用,但您的原始问题未指定选择 100行的方式。

答案 1 :(得分:0)

索引列上的左连接应该相当快地执行删除:

delete a
from TableA a 
left join TableB b on a.MLS = b.LIST_3
where b.LIST_3 is null;

SqlFiddle:http://sqlfiddle.com/#!9/2e1e0/1