有2个表:A源表,B目标表。
假设两个表都有一个相同保证列为id,其它列可以不同。怎样同步可以使B表的行与A表的行相同(只关注id列)。表A 表B
id name id Age
------ ---------
1 a 1 41
2 bbb 2 22
3 fff 3 40
5 dff 5 23
求最有算法
假设两个表都有一个相同保证列为id,其它列可以不同。怎样同步可以使B表的行与A表的行相同(只关注id列)。表A 表B
id name id Age
------ ---------
1 a 1 41
2 bbb 2 22
3 fff 3 40
5 dff 5 23
求最有算法
我的算法如下,总觉得效率不高:
1 读出B表所有id,放入列表listB中
2 用A表记录逐条检查listB中是否存在,如果存在用A表的记录Update B表相应的记录,如果不存在则将A表的相应的列insert into B表,
3 删除listB中刚检查过的id
4 最后listB剩余的id表示B表中多余的记录,删除B表中的多余的记录。
CNT NUMBER(1):=0;
BEGIN --删除B表中多余的数据
DELTE FROM B WHERE NOT EXISTS(SELECT 0 FROM A WHERE A.ID=B.ID);
COMMIT; SELECT COUNT(*) INTO CNT FROM USER_TAB_COLUMNS WHERE TABLE_NAME='B' AND COLUMN_NAME='NAME';
IF CNT=1 THEN
--B表有 name 字段 UPDATE B SET NAME=(SELECT A.NAME FROM A WHERE A.ID=B.ID) WHERE EXISTS(SELECT 0 FROM A WHERE A.ID=B.ID);
COMMIT; INSERT INTO B(ID,NAME) SELECT ID,NAME FROM A WHERE NOT EXISTS(SELECT 0 FROM B WHERE A.ID=B.ID);
COMMIT; ELSE
--B表没有 name 字段 --只有添加数据的操作
INSERT INTO B(ID) SELECT ID FROM A WHERE NOT EXISTS(SELECT 0 FROM B WHERE A.ID=B.ID);
COMMIT;
END IF;
END;
/
由于你不确定B 的结构,所以需要先判断