旧系统库存导入新系统时,如何过滤无效零件号并跳过插入?
高效实现旧库存数据导入并跳过无效零件号
嘿,我懂你现在面对的痛点——要把旧ERP里大量库存数据导入新系统,还得跳过那些在新系统PART_TBL里不存在的无效零件号,而且数据量一大,之前用CASE包裹查询的方法肯定效率拉胯。给你几个专门适配大数据量场景的解决方案:
方案1:用INNER JOIN过滤有效零件(推荐大数据量)
这个方法直接通过关联新系统的有效零件表筛选数据,当PART_TBL的Part_No字段有索引时,性能会非常出色:
INSERT INTO [LOT_TBL] (Part_No, Total_Stock) SELECT o.Part_No_Old, o.Total_Stock FROM OLD_ERP o INNER JOIN PART_TBL p ON o.Part_No_Old = p.Part_No WHERE o.Total_Stock > 0;
INNER JOIN只会保留两边匹配的记录,从根源上就排除了无效零件号的数据,相比子查询,数据库能生成更高效的执行计划,避免重复扫描表的问题。
方案2:用EXISTS子查询(逻辑更直观)
如果觉得JOIN的写法不够直观,用EXISTS也是个靠谱的选择,它的性能在大数据量下同样优秀,数据库会自动优化成半连接操作:
INSERT INTO [LOT_TBL] (Part_No, Total_Stock) SELECT o.Part_No_Old, o.Total_Stock FROM OLD_ERP o WHERE o.Total_Stock > 0 AND EXISTS ( SELECT 1 FROM PART_TBL p WHERE p.Part_No = o.Part_No_Old );
EXISTS的逻辑很直白:检查当前旧数据的零件号是否在新系统的有效列表里,存在才会被选中插入。而且它能避开NOT IN的一个大坑——如果PART_TBL的Part_No字段有NULL值,NOT IN会直接导致所有记录都被过滤掉,完全插不进去,EXISTS就不会有这个问题。
为啥不推荐用NOT IN?
你最初考虑的NOT IN写法,在数据量小的时候没问题,但数据量大时会有两个致命问题:
- 性能差:NOT IN会触发数据库做全表扫描或者重复执行子查询,数据量越大越慢
- 潜在BUG:只要PART_TBL的Part_No存在NULL值,
Part_No_Old NOT IN (...)会返回UNKNOWN,导致所有记录都被过滤,根本插不进数据
额外优化建议
- 一定要给PART_TBL的Part_No字段加主键或唯一索引,这是提升关联/查询性能的核心
- 如果OLD_ERP的数据量特别大(比如几十万条以上),可以考虑分批插入,比如用
TOP或者ROW_NUMBER()分批次处理,避免一次性锁表太久影响新系统的正常使用
内容的提问来源于stack exchange,提问作者Saiyanthou
相关产品推荐
相关产品推荐

