簡體   English   中英

如何使用純SQL獲取增量記錄?

[英]How to get delta records using pure SQL?

我在Oracle SQL中有兩個表T_Person和T_Person_New。

在此處輸入圖片說明

為方便起見,讓Name作為兩個表的唯一標識符。

我可以比較兩個表以使用SQL查詢獲取增量記錄嗎?

增量記錄應包含以下條件:

  1. 如果是現有記錄中的更改。 即DOB /性別/名稱的更改
  2. 如果是新紀錄。

謝謝。

我們可以在這里嘗試使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM