我在Oracle SQL中有两个表T_Person和T_Person_New。
为方便起见,让 Name 作为两个表的唯一标识符。
我可以使用SQL查询比较两个表以获取增量记录吗?
增量记录应包含以下条件:
谢谢。
答案 0 :(得分:1)
我们可以在此处尝试使用EXISTS
子句:
SELECT ID, Name, DOB, Gender
FROM T_Person_New t1
WHERE NOT EXISTS (SELECT 1 FROM T_Person t2
WHERE t1.Name = t2.Name AND t1.DOB = t2.DOB AND t1.Gender = t2.Gender);
这里的逻辑是返回我们无法在原始表中找到完全匹配的记录的每个新记录。这涵盖了该人已经存在但一个或多个字段已更改的情况。而且还涵盖了一个人是全新的,甚至以前都不存在的情况。
答案 1 :(得分:0)
我在您的样本数据中为旧表(t_person)和新表(t_person_new)添加了一条记录,以弥补其中任一表的缺失记录。
我认为id列是两个表中的主键(虽然您提到名称是唯一的,但从您的描述中并不清楚)。
旧表样本数据
insert into t_person values (1, 'Tom', '2000-01-01', 'M');
insert into t_person values (2, 'Gary', '2000-01-01', 'M');
insert into t_person values (3, 'Pam', '2000-01-01', 'F');
insert into t_person values (4, 'Hans', '2000-01-01', 'M');
新表格样本数据
insert into t_person_new values (1, 'Tom', '2000-01-01', 'M');
insert into t_person_new values (2, 'Gary', '2001-01-01', 'F');
insert into t_person_new values (3, 'Pamela', '2000-01-01', 'F');
insert into t_person_new values (5, 'Jane', '2000-01-02', 'F');
这是一个查询,可以显示所有可能的差异。我只在名称列上完成了此操作,您可以将其扩展到所有列。
select case when t.id is null then 'NEW: MISSING-FROM-OLD'
else case when tn.id is null then 'DELETED: MISSING-FROM-NEW'
else 'EXISTS-IN-BOTH'
end
end record_type
,case when tn.name is null then 'MISSING-FROM-NEW, VALUE-IN-OLD (' + t.name + ')'
else case when t.name is null then 'MISSING-FROM-OLD, VALUE-IN-NEW (' + tn.name + ')'
else case when t.name = tn.name then 'SAME-IN-BOTH (' + t.name +')'
else 'CHANGED, VALUE-IN-OLD (' + t.name + '), VALUE-IN-NEW (' + tn.name +')'
end
end
end name_state
from t_person_new tn
full outer join t_person t on tn.id = t.id
注意:对于Oracle,您将必须使用“ ||”而不是“ +”进行连接。我在使用SQL Server时使用了“ +”