我有两张table(例如a和b)。我的任务是将b与a同步,也就是说,如果a中有记录,但b中没有记录,则向b添加记录;如果记录在b中但不在a中,则从b中删除记录。
a和b可以有重复的记录,这样如果a中的记录是重复的,b也应该有重复的记录。a和b中的样本数据
**Table A** **Table B**
id identifier id identifier
100 capital 1001 bat
201 bat 1002 bat
202 bat 1003 bat
5010 keyboard
为此,我使用outer join从a和b获取了记录,因此我的输出如下所示:
A.id B.id identifier
100 null capital
201 1001 bat
201 1002 bat
201 1003 bat
202 1001 bat
202 1002 bat
202 1003 bat
null 5010 keyboard
因此,在上述情况下,100和5010分别是添加和删除候选,这很容易理解。
问题是发现1003也是一个删除候选。因为201和202分别Map到1001和1002。
我可以在数据库中这样做,通过在mysql中对数据库中的重复项进行编号:避免自连接时重复记录的笛卡尔积,但是由于一些限制,我只能使用outer join加载上述格式的数据。因此,我需要一个java算法来完成上述任务。提前谢谢。
2条答案
按热度按时间nnsrf1az1#
我最终想到了这个算法,它不是非常干净或聪明,但似乎做的工作:
输出:
7nbnzgx92#
我是这样解决的:
从表a和表b获取数据。
表a和表b的bucket数据,使用:
其中key是'identifier',samebucketobject是:
基本上,我按标识符将表a和表b的所有元素分组。
在每个bucket中,检查
idsOfA
b的元素idsOfB
,如果这种方法不需要额外的空间