如何高效删除已经import到了数据窗口中的重复记录?
在将一外部的dbf数据文件import到数据库时,经常有手工给出的数据存在重复行,那位大虾有简易高效的解决办法?
注意:本人的开发环境为:PB9 + Oracle 8
问题点数:20、回复次数:7Top
1 楼klbt(快乐白兔)回复于 2003-12-01 23:00:41 得分 0
用DW实现,按主键列排序,对所有行循环判断.Top
2 楼sdahyk()回复于 2003-12-02 08:44:36 得分 0
这样的方法我总感觉不够高效,设想一下,如果DW中有1000条记录,就要循环比对1000*999=99.9万次,如果DW中有1万条记录呢?......
有没有其它方法?Top
3 楼klbt(快乐白兔)回复于 2003-12-02 08:56:17 得分 15
另一个思路,在DBerror事件编码:
if Left(sqlerrtext,9) = "ORA-00001" then
MessageBox("数据错误","第"+String(row)+"行"+"主键重复!",Stopsign!)
end if
return 1Top
4 楼sun1976(嫁给我,你就是我的一妾)回复于 2003-12-02 10:04:41 得分 5
循环不用嵌套,1000计算次数也不多
例子:
/*dw_1 ,主键a1,a2,a3....为方便都设做string 型*/
string ls_a1,ls_a2,ls_a3......
long ll_row,ll_rowcount
//把变量都设置为你的数据窗口中不可能出现的值,这里设为‘’,你可设为"!@##$$%%%%"
ls_a1=''
ls_a2=''
ls_a3=''
....
dw_1.setsort("a1 a,a2 a,a3 a")/*/如果更多字段联合主键,都列上,就是按主键排序*/
dw_1.sort()
ll_rowcount=dw_1.rowcount()
for ll_row = ll_rowcount to 1 step -1/*倒着删除为了行号不会改变,好处理。不然删了一行后其后的行号都减1了*/
if ls_a1=dw_1.getitemstring(ll_row,'a1') and ls_a2=dw_1.getitemstring(ll_row,'a2') and ls_a3=dw_1.getitemstring(ll_row,'a3') then
dw_1.deleterow(ll_row)
else
ls_a1=dw_1.getitemstring(ll_row,'a1')
ls_a2=dw_1.getitemstring(ll_row,'a2')
ls_a3=dw_1.getitemstring(ll_row,'a3')
end if
next
Top
5 楼sdahyk()回复于 2003-12-03 18:14:00 得分 0
快乐白兔的第二种方法我没有想过,等我试一下,行的话就可以结贴了...Top
6 楼sdahyk()回复于 2003-12-03 18:19:05 得分 0
关羽的说法也对,当时我只想到了DW中的任意两条数据都得进行比对...
不过总感觉这样的方法不够高效,要多写这么多代码。Top
7 楼sdahyk()回复于 2003-12-03 21:44:34 得分 0
感谢快乐白兔提供的思路,问题已经解决。多谢!Top




