问题描述
内存中有两个数据表,表一来自SQL数据库查询,表二是从客户端提交的XML转换来的,表结构不一样,现在想用表二的值来更新表一中对应ID的记录中字段名相同的值。表一:id,tname,tcount,tnote111122223333表二:id,tname,tt,tnote,pk111ab33ccc44444要把表一更新为:id,tname,tcount,tnote111a333c44null4说明:记录3删除了增加了记录4共有的字段数据更新成了表二的值新增的记录因为缺少对应项,所以tcount字段是空的表一中有的字段,按ID对应更新成了表二的值~表一中有的ID表二没有的记录从表一中删除表一中没有的ID而表二又有的,增加到表一里问:什么方式来实现会最快~
解决方案
解决方案二:
晕哦,空格被忽略了~
解决方案三:
补充一下,上面只是个例子,实际问题是,只知道一定有一个id这种对应字段,并不确定表一和表二各有多少个字段,更不知道它们有多少个字段的名称是相同的,顺序也不确定。但是,只要字段名相同,则数据类型就是一样的~
解决方案四:
只能老老实实的表结构读出来,之后把xml对比表结构,一条一条操作吧.
解决方案五:
查找比对
解决方案六:
那如果不算ID,的情况下表一有X条记录Y个字段表二有M条记录N个字段需要比较X*Y*N+M*M*X这么多次吧~可能还更多,有没有办法可以减少运算呢~
解决方案七:
X*Y*N+M*N*X
解决方案八:
X*Y*M+M*N*X
解决方案九:
列固定就不用那么多了,不固定那只能遍历
解决方案十:
我先是生成一个新的数据表,三个字段:f_name,f_index1,f_index2f_name记录这两个数据表都包含的字段名称;f_index1记录这个字段在第一个数据表的索引;f_index1记录这个字段在第二个数据库的索引。生成这个表的好处是,更新值的时候不需要遍历所有字段了,只需要按照已经记录在案的索引来操作即可。因为我最终需要的是表一,所以这个表是这样得到的:用了两个嵌套的循环,外循环是表一的栏位遍历,内循环是表二的栏位遍历遍历表一的所有栏位,拿栏位名称与表二的所有栏位名称做对比,比较之前都先转换成了大写~遇到栏位名称相同的,就记录下来。为了较少比较的次数,此时还专门用BREAK退出了内循环~本来,我觉得已经登记过的索引应该在以后的比较中忽略掉,但是忽略也需要先做比较,这样看来好像并不能减少比较次数,所以就放弃了~得到这个【相同字段对应表】之后,再根据表一和表二的对应关系,先比较表一的记录在表二中是否存在,存在的话,就用表二的记录来更新表一的记录,如果不存在,就从表一中删除。然后比较表二的记录ID在表一中是否之前就存在,存在的话,因为之前已经更新过了,所以忽略,不存在的话,就把相同字段的值组成的新行添加到表一。之所以要先删除后添加,是为了第二次比较的时候待比较的行会少一些。另外,行更新之前,也可以做一次值的比较,因为两个表都有的ID值的那些行,有可能对应字段的值也是相同的,这种情况下,可以不需要用表二的值来更新表一的值,这样的好处是,表一的行状态可以保持为Unchanged。这样如果需要用表一来更新数据库,则有可能大大减少发往数据库的命令。关于这一点,我还没有做实验,暂时只是猜测。我还没有搞清楚如果用同样的值来修改行,会不会改变行状态,更不知道,如果多次被修改成另外的值的记录,在提交之前再被修改回来的话,更新数据库的时候会不会忽略它。这里说的再次被修改回来是指【RejectChanges】以外的方法,因为【RejectChanges】的话,行状态是会重置为Unchanged的~这个,我明天试验一下~
解决方案十一:
引用9楼xiaomanger的回复:
我先是生成一个新的数据表,三个字段:f_name,f_index1,f_index2f_name记录这两个数据表都包含的字段名称;f_index1记录这个字段在第一个数据表的索引;f_index1记录这个字段在第二个数据库的索引。生成这个表的好处是,更新值的时候不需要遍历所有字段了,只需要按照已经记录在案的索引来操作即可。因为我最终需要的是表一,所以这个表……
学习lz的发帖精神感觉这些比较的次数还算可以了如果数据量不大没什么感觉的
解决方案十二:
在比较次数不能减少的情况下看看对象是否有优化的可能减少大对象的实例化和在内存中不必要的操作当然这些前提是数据量达到一定地步数据量不大的话没什么关系至于多少数据量算大看实际情况吧
解决方案十三:
俺搞定了这个问题~用数据表dt_1来更新数据表dt_2其他参数用来指定主键名称或者主键的索引datable_update(DataTabledt1,DataTabledt2,stringkeyname)datable_update(DataTabledt1,stringdt1_keyname,DataTabledt2,stringdt2_keyname)datable_update(DataTabledt1,Int32dt1_key_index,DataTabledt2,Int32dt2_key_index)思路在9楼~坐等更好的法子~