最近在開發的時候遇到一個mysql的子查詢刪除原表資料的問題。在網上也看了很多方法,基本也是然並卵(不是寫的太亂就是效率太慢)。
公司DBA給了一個很好的解決方案,讓人耳目一新。
DELETE fb.* FROM froadbill.bill fb LEFT JOIN froadbill.refundinfo br ON br.billSeqNo = fb.seq_no WHERE br.billSeqNo IS NULL AND fb.create_time >='20150102000000' AND fb.create_time <'20150302000000' ;
froadbill.bill是賬單表(約1kw資料),froadbill.refundinfo是退款表(約10w資料)。這條sql是要刪除賬單表20150102-20150302並且不在退款表的資料。這種寫法避免了在sql中使用in或者not in這種低效的語句。
資料插入也可以使用這種寫法:
INSERT INTO froadbill.bill_history SELECT DISTINCT fb.* FROM froadbill.bill fb LEFT JOIN froadbill.refundinfo br ON br.billSeqNo = fb.seq_no WHERE br.billSeqNo IS NULL AND fb.create_time >='20150102000000' AND fb.create_time <'20150302000000' ;