2016-02-27 28 views
0

所以我有2個表。 TableA有350K行,TableB只有TableA應該有的有效數據。所以我需要清除TableA中的舊數據。用不在查詢中檢查的限制行 - SQL

如果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; 
+0

您正在使用的數據庫什麼的rownum? –

回答

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行尋找的方式。
+0

這不是主鍵,我比較的列是VARCHAR。 – AbdelElrafa

+0

@skoltyno。 。 。我在說你應該使用一個主鍵,比如'id',而不是其中的一列是主鍵。而列的類型是不相關的。 –

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