100分求快速比较记录的算法

surefire 2006-10-26 09:08:21
在《语言算法》那个版发了帖,没人理,100分在这里求好方法。

我有一个表TABLE用来记录居民信息,结构如下:
aid:居民街道号
id:居民身份证号——数据库中唯一
pid:父亲身份证号name:姓名
sex:性别——0或1表示male或female
birth:出生日期
additional_info:附加信息

现在已经有大量数据插入数据库,而手上有一个csv的数据文件,数据都是按照表结构排列。
我需要检查数据文件中的每条记录,去跟数据库中的记录对比看文件中各记录的每个字段有没有变化或被修改。

比如csv文件中的一条记录是:
aid:4
id:4030203
pid:34329223
name:alex
sex:male
birth:1980-8-4
additional_info:mmmmm

我要查找数据库的TABLE,检查aid,id,pid,name等字段的信息有没有被修改,如果任意两个字段信息都被修改则把该记录当做新记录插入数据库,如果只有一个字段信息不匹配则在数据库中修改该字段数据为csv文件中的值。我采取的方法是:

1:先对csv文件按找sex排序
2:从csv中读取第一条记录,得到它的sex字段,假如为male
3:select * from TABLE where sex=male order by id;
4:根据从csv中读取的记录的id,在3步中返回的记录集中二分法查找
5:查到该id对应的记录后,分别判断其aid,pid,name等信息是否被修改,如果多于一个字段被修改,则把该记录插入数据库
6:如果没有查到该id对应的记录,就用TADOQuery.Locate(Aid,pid,name)定位。
7:如果Locate返回真,则说明只有id被修改,否则把该记录添加进数据库。

我在SQL Server2000上做,BDS2006,11000条记录吧,做一次完整的audit需要35分钟左右,有没有更好的办法?

恳请高手不要太吝啬,对于好算法可以再开帖加分。
...全文
329 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
surefire 2006-10-26
  • 打赏
  • 举报
回复
因为我对数据库操作不怎么熟悉,
存储过程也不知道怎么做。
建立临时表应该是个好办法,比不断读CSV文件应该要快。
Delphi_Li 2006-10-26
  • 打赏
  • 举报
回复
我的想法是这样的:(注以下方法是针对Oracle的,SQL Server的应该类似),假设原始表的名称为TB_Source,另外你的数据表中好像没有唯一键,这样不好确定记录的位置,可能是你没有说明。
1、将CVS文件的数据导入到临时表中,用SQLLoder你的那些记录用不了10秒的!!!表的名称为TB_Target
2、创建一个临时表,这个表中存储了所有的四个字段有任意一个不匹配的记录,同时在该表中增加一个标志字段X,用来标示该记录是否已经处理
Create Table TB_Temp_A As
( Select 唯一键, ID, PID, SEX, NAME, 0 X From TB_Target
Minus
Select 唯一键, ID, PID, SEX, NAME, 0 X From TB_Source )
3、以ID为基准,找出其他三个字段有不一致的数据
Create Table TB_Temp B As
( Select 唯一键, ID From TB_Temp_A
Minus
Select 唯一键, ID From TB_Source )
4、选择出来的数据就是ID不一致的数据了,然后将TB_Temp_A中的X更新为11,表示这些列有1个ID字段不一致
Update TB_Temp_A
Set X = 11
Where( 唯一键 = ( Select 唯一键 from TB_Temp_B ) );
5、选择出除了ID不一致以外,还有其他字段不一致的数据
Update TB_Temp_A
Set X = 21
Where( X = 1 ) And
( 唯一键 = ( Select 唯一键 From
( Select 唯一键, PID, SEX, NAME From TB_Temp_B
Minus
Select 唯一键, PID, SEX, NAME From TB_Source ) ) );
6、然后进行类似的循环,只不过在重复第三步的时候,在TB_Temp_A后加上条件X=0

X字段值的定义为:0-未处理,11-ID字段不一致,21-除了ID不一致外还有其他字段不一致
12-PID字段不一致,22-除了PID不一致外还有其他字段不一致
13-Name字段不一致,23-除了Name不一致外还有其他字段不一致
14-Sex字段不一致,24-除了Sex不一致外还有其他字段不一致

7、处理完成后,你就可以按照你的要求将X<=14的数据进行更新,X>=21的数据进行插入


以上的步骤写的比较简单,还需要你自己琢磨!!!

按照我在Oracle上的经验,处以11000条数据在一个配置比较差的计算机上最多5分钟!!!
另外,你的所有操作最好使用存储过程进行,这样不但效率高,而且存储过程的改动不影响到程序的结构!!!不需要重新编译程序(存储过程的参数变化除外)


chl_seu 2006-10-26
  • 打赏
  • 举报
回复
同意楼上的 应该不用游标就可以了
写条sql对比插入应该行
postren 2006-10-26
  • 打赏
  • 举报
回复
这样11000条记录最多几分钟就该搞定了
postren 2006-10-26
  • 打赏
  • 举报
回复
1 建立一个表如T1,把所有csv中的数据全部导入到T1
2 写个存储过程,用游标遍历T1,把Table中和T1中不同的数据添加到Table中

surefire 2006-10-26
  • 打赏
  • 举报
回复
谁知道SQL Server里有minus吗?
lgplgp2008 2006-10-26
  • 打赏
  • 举报
回复
Delphi_Li(Delphi Li)的做法很好,建临时表很快的。

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧