无主键时避免重复加载Excel数据至Oracle的SQL查询需求
Oracle 避免重复加载Excel数据到数据库的实现
现有数据情况
Excel表 table1 数据:
ID Name ----------- xx yy zz bb yy ll
Oracle数据库表 Table2 现有数据:
ID Name ---------- jj kk xx yy zz bb
目标
将table1的数据加载到Table2,跳过已存在的重复记录,最终Table2保留原有数据+table1中独有的记录,结果如下:
ID Name ---------- jj kk yy ll
解决方案
方法1:用MERGE语句(推荐,支持灵活的匹配规则)
先把Excel数据导入数据库临时表temp_table1(可通过Oracle数据泵、外部表或第三方工具实现),然后执行MERGE:
MERGE INTO Table2 t2 USING (SELECT ID, Name FROM temp_table1) t1 -- 这里用ID+Name判断重复,根据实际业务可调整为唯一键(比如仅ID) ON (t2.ID = t1.ID AND t2.Name = t1.Name) WHEN NOT MATCHED THEN INSERT (ID, Name) VALUES (t1.ID, t1.Name);
这个语句会自动对比两张表的记录,只插入Table2中不存在的行。
方法2:用INSERT + NOT EXISTS
如果只需要单纯的插入操作,用这个更直接:
INSERT INTO Table2 (ID, Name) SELECT t1.ID, t1.Name FROM temp_table1 t1 WHERE NOT EXISTS ( SELECT 1 FROM Table2 t2 WHERE t2.ID = t1.ID AND t2.Name = t1.Name );
关键注意点
- 重复判断的条件要贴合业务逻辑:如果
ID是主键,仅对比ID即可;如果允许同ID不同Name的情况,就需要同时对比两个字段。 - 大数据量场景下,先导入临时表再处理,比直接读取Excel文件执行SQL效率高很多。
内容的提问来源于stack exchange,提问作者KK24
相关产品推荐
相关产品推荐

