想写一段程序实现:
顺序读A表,看如果A的主键没有出现在B的表中,那么insert B表
如果在B的表中且这两条记录中字段的值有不一致的,那么update B表
否则不操作,
sql好写,java里判断这个怎么实现好?!
大家办看看~ 谢谢~
20 个解决方案
#1
用set, TreeSet这个类,你研究一下。
#2
不知道,顶一下
#3
如果是数据量小的话``这个问题好解决`,不知道你的数据量是多少.
#4
数据量在3000条吧~
#5
把B表中的与A表主键对应的属性建hash表
像这种才3000的数据量建hash表顶好的
当找到 B 表中有 A表那条记录的时候
没必要去比较是不是有属性不一致
毕竟检查的过程就是O(N)的
直接把B表中的记录覆盖得了
个人观点 可能不好
像这种才3000的数据量建hash表顶好的
当找到 B 表中有 A表那条记录的时候
没必要去比较是不是有属性不一致
毕竟检查的过程就是O(N)的
直接把B表中的记录覆盖得了
个人观点 可能不好
#6
楼上的方法就可以`查出A表B表的所有行,放入HashMap里 ,key放表的
主键,vaule放行对象。然后遍历这个HashMap,再插入B表中。小数据量可以这样。
主键,vaule放行对象。然后遍历这个HashMap,再插入B表中。小数据量可以这样。
#7
用hashTable 把判断的条件放在key里面
然后用 Hashtable.containsKey(key) 判断是否存在
然后用 Hashtable.containsKey(key) 判断是否存在
#8
Set还需要判断元素是否存在吗?
而且Hashtable.containsKey(key)是判断对象是否为此哈希表中的键。
#9
目的只为了更新B表,每次都SAVAORUPDATE一下就OK了。
#10
sql好写,java里判断这个怎么实现好?!
LZ,我觉得你SQL根本就没写好,写好怎么会出现这种需求的呢,在数据库里已经能解决了,
比如你A表与B表的主键字段名为id,其余字段名分别为test1、test2……一直到test50,你不是50个左右的字段嘛
顺序读A表,看如果A的主键没有出现在B的表中,那么insert B表:
select * from A where id not in(select id from B)
取出符合要求的A表的内容,直接插呗
如果在B的表中且这两条记录中字段的值有不一致的,那么update B表:
select A.id,A.test1,A.test2 from a,b where A.id=B.id and (A.test1 <> B.test1 or A.test2 <> B.test2)
后面50个字段我就不写那么多了,意思在这呢,这时取出的就是符合你“如果在B的表中且这两条记录中字段的值有不一致的”这个要求的A表的内容,直接更新呗
LZ,我觉得你SQL根本就没写好,写好怎么会出现这种需求的呢,在数据库里已经能解决了,
比如你A表与B表的主键字段名为id,其余字段名分别为test1、test2……一直到test50,你不是50个左右的字段嘛
顺序读A表,看如果A的主键没有出现在B的表中,那么insert B表:
select * from A where id not in(select id from B)
取出符合要求的A表的内容,直接插呗
如果在B的表中且这两条记录中字段的值有不一致的,那么update B表:
select A.id,A.test1,A.test2 from a,b where A.id=B.id and (A.test1 <> B.test1 or A.test2 <> B.test2)
后面50个字段我就不写那么多了,意思在这呢,这时取出的就是符合你“如果在B的表中且这两条记录中字段的值有不一致的”这个要求的A表的内容,直接更新呗
#11
把b的主键全取出来放一hashmap,然后轮循a的主键,看看此hashmap是否containsKey(a),true就update,false就insert。
不知道效率如何。
不知道效率如何。
#12
这口气象我们项目经理,说谁都会说~
就如你所说的:“如果在B的表中且这两条记录中字段的值有不一致的”
给些个java示例吧~
#13
有点搞不懂你的意思了,我都已经给出SQL语句了,还说“谁都会说”,你是不是心里对我这样说话的先产生抵触直接就不看答案了?
而且“如果在B的表中且这两条记录中字段的值有不一致的”这句话是你的原话,不是我的,我的意思是我的SQL语句是符合你这句话的要求的,能有更好的解决方案为什么非要用JAVA
#14
路过,学习了!
#15
还是觉得这样的事情交给数据库做最好了。数据库自己做这种事情有优化的。
主键固定范围的情况下,先把空数据都插入好,规定对这个表只能update。
主键不固定的情况下,依然规定可直接对这个表做update,在数据库中用触发器拦update,若数据不存在则转做Insert,否则正常update。
考虑到别的用户并发修改问题,还有数据库对not exists之类的操作优化肯定好,上述做法应该是不错的。
主键固定范围的情况下,先把空数据都插入好,规定对这个表只能update。
主键不固定的情况下,依然规定可直接对这个表做update,在数据库中用触发器拦update,若数据不存在则转做Insert,否则正常update。
考虑到别的用户并发修改问题,还有数据库对not exists之类的操作优化肯定好,上述做法应该是不错的。
#16
先把B中存在的A的id的记录全部删掉
再把A的所有记录全部搬到B中
delete from B where id in (select A.id from A)
insert into B (select * from A)
直接这两条语句不行么?!
再把A的所有记录全部搬到B中
delete from B where id in (select A.id from A)
insert into B (select * from A)
直接这两条语句不行么?!
#17
这口气象我们项目经理,说谁都会说~
我是项目经理,谢天谢地,不是你的。
我是项目经理,谢天谢地,不是你的。
#18
16楼的正解
看了半天我以为我看错了呢 还好有人和我一样想法 哈哈
我说怎么好象就是把A中全部数据丢到B表啊 搞这么复杂干什么
看了半天我以为我看错了呢 还好有人和我一样想法 哈哈
我说怎么好象就是把A中全部数据丢到B表啊 搞这么复杂干什么
#19
#20
楼主的意思就是将A表记录移植到B表中,B表已经存在的旧记录如果在A表中有更新,则存储新记录
java判断要从数据库里面取数据,不推荐,在数据库里面处理就行了。
java判断要从数据库里面取数据,不推荐,在数据库里面处理就行了。
#21
#1
用set, TreeSet这个类,你研究一下。
#2
不知道,顶一下
#3
如果是数据量小的话``这个问题好解决`,不知道你的数据量是多少.
#4
数据量在3000条吧~
#5
把B表中的与A表主键对应的属性建hash表
像这种才3000的数据量建hash表顶好的
当找到 B 表中有 A表那条记录的时候
没必要去比较是不是有属性不一致
毕竟检查的过程就是O(N)的
直接把B表中的记录覆盖得了
个人观点 可能不好
像这种才3000的数据量建hash表顶好的
当找到 B 表中有 A表那条记录的时候
没必要去比较是不是有属性不一致
毕竟检查的过程就是O(N)的
直接把B表中的记录覆盖得了
个人观点 可能不好
#6
楼上的方法就可以`查出A表B表的所有行,放入HashMap里 ,key放表的
主键,vaule放行对象。然后遍历这个HashMap,再插入B表中。小数据量可以这样。
主键,vaule放行对象。然后遍历这个HashMap,再插入B表中。小数据量可以这样。
#7
用hashTable 把判断的条件放在key里面
然后用 Hashtable.containsKey(key) 判断是否存在
然后用 Hashtable.containsKey(key) 判断是否存在
#8
Set还需要判断元素是否存在吗?
而且Hashtable.containsKey(key)是判断对象是否为此哈希表中的键。
#9
目的只为了更新B表,每次都SAVAORUPDATE一下就OK了。
#10
sql好写,java里判断这个怎么实现好?!
LZ,我觉得你SQL根本就没写好,写好怎么会出现这种需求的呢,在数据库里已经能解决了,
比如你A表与B表的主键字段名为id,其余字段名分别为test1、test2……一直到test50,你不是50个左右的字段嘛
顺序读A表,看如果A的主键没有出现在B的表中,那么insert B表:
select * from A where id not in(select id from B)
取出符合要求的A表的内容,直接插呗
如果在B的表中且这两条记录中字段的值有不一致的,那么update B表:
select A.id,A.test1,A.test2 from a,b where A.id=B.id and (A.test1 <> B.test1 or A.test2 <> B.test2)
后面50个字段我就不写那么多了,意思在这呢,这时取出的就是符合你“如果在B的表中且这两条记录中字段的值有不一致的”这个要求的A表的内容,直接更新呗
LZ,我觉得你SQL根本就没写好,写好怎么会出现这种需求的呢,在数据库里已经能解决了,
比如你A表与B表的主键字段名为id,其余字段名分别为test1、test2……一直到test50,你不是50个左右的字段嘛
顺序读A表,看如果A的主键没有出现在B的表中,那么insert B表:
select * from A where id not in(select id from B)
取出符合要求的A表的内容,直接插呗
如果在B的表中且这两条记录中字段的值有不一致的,那么update B表:
select A.id,A.test1,A.test2 from a,b where A.id=B.id and (A.test1 <> B.test1 or A.test2 <> B.test2)
后面50个字段我就不写那么多了,意思在这呢,这时取出的就是符合你“如果在B的表中且这两条记录中字段的值有不一致的”这个要求的A表的内容,直接更新呗
#11
把b的主键全取出来放一hashmap,然后轮循a的主键,看看此hashmap是否containsKey(a),true就update,false就insert。
不知道效率如何。
不知道效率如何。
#12
这口气象我们项目经理,说谁都会说~
就如你所说的:“如果在B的表中且这两条记录中字段的值有不一致的”
给些个java示例吧~
#13
有点搞不懂你的意思了,我都已经给出SQL语句了,还说“谁都会说”,你是不是心里对我这样说话的先产生抵触直接就不看答案了?
而且“如果在B的表中且这两条记录中字段的值有不一致的”这句话是你的原话,不是我的,我的意思是我的SQL语句是符合你这句话的要求的,能有更好的解决方案为什么非要用JAVA
#14
路过,学习了!
#15
还是觉得这样的事情交给数据库做最好了。数据库自己做这种事情有优化的。
主键固定范围的情况下,先把空数据都插入好,规定对这个表只能update。
主键不固定的情况下,依然规定可直接对这个表做update,在数据库中用触发器拦update,若数据不存在则转做Insert,否则正常update。
考虑到别的用户并发修改问题,还有数据库对not exists之类的操作优化肯定好,上述做法应该是不错的。
主键固定范围的情况下,先把空数据都插入好,规定对这个表只能update。
主键不固定的情况下,依然规定可直接对这个表做update,在数据库中用触发器拦update,若数据不存在则转做Insert,否则正常update。
考虑到别的用户并发修改问题,还有数据库对not exists之类的操作优化肯定好,上述做法应该是不错的。
#16
先把B中存在的A的id的记录全部删掉
再把A的所有记录全部搬到B中
delete from B where id in (select A.id from A)
insert into B (select * from A)
直接这两条语句不行么?!
再把A的所有记录全部搬到B中
delete from B where id in (select A.id from A)
insert into B (select * from A)
直接这两条语句不行么?!
#17
这口气象我们项目经理,说谁都会说~
我是项目经理,谢天谢地,不是你的。
我是项目经理,谢天谢地,不是你的。
#18
16楼的正解
看了半天我以为我看错了呢 还好有人和我一样想法 哈哈
我说怎么好象就是把A中全部数据丢到B表啊 搞这么复杂干什么
看了半天我以为我看错了呢 还好有人和我一样想法 哈哈
我说怎么好象就是把A中全部数据丢到B表啊 搞这么复杂干什么
#19
#20
楼主的意思就是将A表记录移植到B表中,B表已经存在的旧记录如果在A表中有更新,则存储新记录
java判断要从数据库里面取数据,不推荐,在数据库里面处理就行了。
java判断要从数据库里面取数据,不推荐,在数据库里面处理就行了。