Я добавил еще одну запись в ваши примеры данных для старых (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