所以我有2张桌子。具有35万行的TableATableB仅具有TableA应该具有的活动数据。所以我需要清除TableA中的旧数据。

如果Table A不太大,此查询将非常有用。

DELETE FROM TableA where MLS NOT IN (SELECT LIST_3 FROM TableB);


因此,我需要做的是限制在TableA中检查的行数。而不是它检查TableA中的350K记录,例如,我希望它检查100。

我不知道怎么办...这行不通,因为它只限制删除的行数并且不检查。它可能会检查500行并删除100。我希望它能检查100行并删除,但是许多不在TableB中。

DELETE FROM TableA where MLS NOT IN (SELECT LIST_3 FROM TableB) LIMIT 100;

最佳答案

如果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行的方式。

关于mysql - 限制使用不在查询中检查的行-SQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35672874/

10-13 07:56
查看更多