Oracle 如何跳过重复记录?

Oracle 如何跳过重复记录?,oracle,shell,sql-loader,Oracle,Shell,Sql Loader,我正在编写一个SQL*加载器脚本,将大量数据上传到表中 脚本的工作方式如下: 它连接到FTP服务器并镜像目录以获取所有已生成的新文件,然后将所有CSV文件保存到单个文件中,然后从这个更大的CSV文件中上载数据 基本上,我正在寻找一种方法,如果表中已经存在第一个to记录,SQL*Loader甚至不尝试插入记录 问题是,这个表将容纳多达1000万条记录,有时这些文件会在不应该下载的时候被错误下载,这意味着一些记录会重复 我在需要它的两个字段上放置了唯一的键 我尝试将max errors更改为脚本将尝

我正在编写一个SQL*加载器脚本,将大量数据上传到表中

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

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

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

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

我尝试将max errors更改为脚本将尝试插入的行数,但我注意到,这样做并让它们返回约束冲突错误比没有重复记录时要慢得多,而且会创建一个非常大的日志文件

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

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


附加问题:如果我有10个CSV文件,将每个文件发送给SQL*Loader,或者制作一个包含这10个文件中的数据的文件,这会更好吗?

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

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

为了防止SQL加载器在记录已经存在于表中时插入该记录,可以使用一条条件语句,使SQL加载器跳过该记录,除非它满足必要的条件。例如:

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

根据Solllodollo答案,将记录导入临时表,但

DELETE FROM  temptable WHERE id IN (SELECT id FROM yourtable)?
然后,您可以将诱惑插入表中


当然,这取决于行之间的差异。可能最好在问题中指出这一点。

根据Solllodollo的回答,将记录导入临时表,但

DELETE FROM  temptable WHERE id IN (SELECT id FROM yourtable)?
然后,您可以将诱惑插入表中


当然,这取决于行之间的差异。可能最好在问题中指出这一点。

请澄清是多次获取同一个CSV文件的问题,还是在不同的CSV文件中重复数据的问题。@Gnudiff我进行了编辑以反映它。我不介意CSV文件被重复,因为它最终会发生,我希望脚本忽略表中已经存在的行。好的。我开始写答案的想法是,问题是CSV中的重复行(sort&uniq会有帮助),但如果需要对照实际的SQL表进行检查,那么似乎必须在SQL中进行检查。请澄清多次获取相同的CSV文件是否有问题,或者使用可以在不同CSV文件中复制的数据。@Gnudiff我已编辑以反映它。我不介意CSV文件被重复,因为它最终会发生,我希望脚本忽略表中已经存在的行。好的。我开始写答案是基于这样一个想法,即问题是CSV中的重复行(sort&uniq会有帮助),但是如果您需要对照实际的SQL表进行检查,那么您似乎必须在SQL中进行检查。在这个特定的脚本中,这是极不可能的(实际上是不可能的)相同的操作将在获取的CSV文件中重复记录。问题是其中一些记录已经保存到表中。我需要SQL*加载器跳过这些记录。如果我读取正确,您的查询将只返回temp表中未重复的所有值(在我的情况下,所有值都是重复的)。在这种情况下,您可以添加另一个步骤,从temp表中删除所有现有记录,然后执行插入。接下来的步骤是:1。将记录插入临时表。2.当永久表中存在记录时,从临时表中删除。3.从临时表插入永久表。在这个特定的脚本中,同一个操作在获取的CSV文件中不太可能(实际上不可能)有重复记录。问题是其中一些记录已经保存到表中。我需要SQL*加载器跳过这些记录。如果我读取正确,您的查询将只返回temp表中未重复的所有值(在我的情况下,所有值都是重复的)。在这种情况下,您可以添加另一个步骤,从temp表中删除所有现有记录,然后执行插入。接下来的步骤是:1。将记录插入临时表。2.当永久表中存在记录时,从临时表中删除。3.从临时表插入永久表。