table A{financode,orgcode,areacode,impawncode,flag} (未建立索引和主键)   代码1,   代码2,        代码3,             代码4,         代码5
   30203013010,3203030000752441,3940102007MR00050100,3222007052900000,1
   39103010L09,3505000000189956,3510502006M100001100,3512006002419000,1
   61703010113,4501000000733583,4530052003M100014900,4532000000412000,9
   61703010113,4501000000733583,4530052003M100014900,4532000000412000,9
   61103010202,4501000000097671,4510302007M100000200,4512007002317000,9
   61103010202,4501000000097671,4510302007M100000200,4512007002437000,9
.................................
第一行为字段名,从第二行开始为数据
这些数据开始是存在txt文件里 ,如上面的格式 ,有150万条数据左右,我想用sql*loader将这些数据加载到table A中。有两个问题:1.如何写sql*loader配置文件时候将第一行的字段名称去掉。2.还有一个问题就是这些数据中有大量得重复数据,就是5个字段的值都是一样。我想如何在配置文件中将重复数据去掉,不加载到table A中,好像distinct一样。
我写的配置文件为:
LOAD DATA
INFILE zhloanform.txt
INTO TABLE TEMP_ZHUPDATE_DUEBILLINFO
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(financode, orgcode, areacode,impawncode, flag)
如何修改上面配置文件才能达到我需要的效果呢,希望高手能帮我提供帮助,谢谢!
另:可以不再加载的时候将重复数据去掉,全部入库,由于业务需要,我也可以再在存储过程中,select distinct* from table A 将重复数据去掉。但是有一个问题就是我需要查询出每一行的rowid。select rowid,financode,orgcode,areacode,impawncode,flag from table A,请问我如何在查询出rowid同时也能将
financode+orgcode+areacode+impawncode+flag相同数据去掉。才接触数据库,麻烦大家帮我看看。一起讨论下。:)

解决方案 »

  1.   

    1: 如何写sql*loader配置文件时候将第一行的字段名称去掉。应该会第一行记录会skipped的吧?或者改下ctl文件如下:
    LOAD DATA 
    INFILE zhloanform.txt 
    INTO TABLE TEMP_ZHUPDATE_DUEBILLINFO
    when   (1:3) <> '字段名' 
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
    (financode, orgcode, areacode,impawncode, flag) 
    2: 还有一个问题就是这些数据中有大量得重复数据,就是5个字段的值都是一样。
    数据全部入库后,快速删除重复记录:
    delete from table A
     where rowid > (select min(rowid) 
                      from table B 
                     where A.financode = B.financode
                       and A.orgcode = B.orgcode
                       and A.areacode = B.areacode
                       and A.impawncode = B.impawncode
                       and A.flag = B.flag);
    3: 请问我如何在查询出rowid同时也能将 financode+orgcode+areacode+impawncode+flag相同数据去掉。你可以在存储过程中先把没删除前的记录(包括rowid)存在一个cursor中,
    select rowid,financode,orgcode,areacode,impawncode,flag from table A
    等删除重复记录后再读出这个cursor的value(包括rowid)包括rowid就可以了。Good luck! ...
      

  2.   

    给你个简便的不能再简便的方法吧。
    首先,应用editplus或者utltraedit软件来打开你的zhloanform.txt 文件,然后选择排序功能,勾选"删除重复行",点确认
    按钮后,你将得到剩余的非重复数据。(注意查看你的第一行,看看是否为字段名,如果不是找到它,把他移到第一行;或者再排序前将其先剪切了,排完顺序再放他到首行)接着,应用plsql developer或者toad的text importer功能菜单,图形化的选择一下就可以把你的数据导入到表中了。很方便的。
      

  3.   

    如果想导入表之后删除,考虑到上百万条记录,下面这个是删除重复记录相对来说最高效的一种方法,减少了表的遍历。delete from TABLE
    where rowid in
    (select rowid from
    (select rowid,row_number() over(partition by financode,orgcode,areacode,impawncode,flag
    order by financode,orgcode,areacode,impawncode,flag) rn
    from TABLE)
    where rn>1)
      

  4.   

    delete from TABLE
    where rowid in
    (select rowid from
    (select rowid,row_number() over(partition by financode,orgcode,areacode,impawncode,flag
    order by financode,orgcode,areacode,impawncode,flag) rn
    from TABLE)
    where rn>1)