如何跳过重复记录?

时间:2017-10-23 19:55:14

标签: oracle shell sql-loader

我正在使用SQL * Loader脚本将大量数据上传到表格。

该脚本的工作方式如下: 它连接到FTP服务器并镜像目录以获取所有已生成的新文件,然后获取所有CSV文件并将其保存为单个文件,然后从这个较大的CSV文件中上传数据。

基本上,我正在寻找一种方法,如果第一个记录已存在于表中,SQL * Loader甚至不会尝试插入记录。

问题是,该表将容纳多达1000万条记录,有时这些文件会在不应该下载时被错误地下载,这意味着某些记录会重复出现。

我在需要它的两个字段上放置了唯一键。

我尝试将最大错误更改为脚本将尝试插入的行数但我注意到这样做并让它们返回Constraint Violation错误比没有重复记录时要慢得多,它会创建一个真的很大的日志文件。

在SQL * Loader控制文件中是否有一种方法可以放置一个条件(在两个字段上,因为其中任何一个可以重复但不能同时重复)?

或者你认为什么可以帮助我加快这个过程?

奖金问题:如果我说10个CSV文件,将每个文件发送到SQL * Loader或制作包含10个数据的单个文件,会不会更好?

2 个答案:

答案 0 :(得分:2)

根据solllodolllo的回答,将记录导入临时表,但随后

DELETE FROM  temptable WHERE id IN (SELECT id FROM yourtable)?

之后你可以将temptable插入yourtable。

这当然取决于您的行与其他行的不同方式。可能在问题中表明这一点很好。

答案 1 :(得分:0)

为防止SQL Loader插入表中已存在的记录,您可以使用条件语句使SQL Loader跳过记录,除非它满足您的必要条件。例如:

LOAD DATA
 INFILE 'YourData.dat'
 BADFILE 'YourBadData.bad'
APPEND INTO TABLE YourTable
WHEN (Condition 1 = TRUE) AND (Condition 2 = FALSE)
{
...

要加快初始加载过程,可以将所有记录插入临时表,然后使用select语句将所有不同的行插入到永久表中。

INSERT INTO YourTable
SELECT DISTINCT [fields]
FROM tempYourTable