[英]How to get delta records using pure SQL?
我們可以在這里嘗試使用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);
這里的邏輯是返回每條新記錄,我們無法在原始表中找到與其完全匹配的記錄。 這涵蓋了該人已經存在但一個或多個字段已更改的情況。 它也涵蓋了這個人是完全新的,甚至以前不存在的情況。
我在您的樣本數據中為舊表(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時使用了'+'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.