2017-06-02 75 views
0

我有2個表,我需要做一個表比較:比較表中的內容

TABLE A 
    LABEL 
    VALUE 

TABLE B 
    LABEL 
    VALUE 

基本上我想:

  • 記錄在該值不匹配的標籤等於
  • 記錄在表A中沒有的表B
  • 記錄表B中沒有的表A

有了這些信息,我可以記錄我需要的適當的歷史數據。它會告訴我值在哪裏發生了變化,或者標籤被添加或刪除的位置......您可以說TABLE A是「新」數據集,TABLE B是「舊」數據集。所以我可以看到正在添加的內容,刪除的內容以及更改的內容。

一直試圖與聯盟&減少,但沒有運氣。

喜歡的東西:

A LABEL A VALUE  B LABEL B VALUE 
    --------------------------------------- 
    XXX  5   XXX   3 
    YYY  2 
          ZZZ   4 
    WWW  7   WWW   8 

如果標籤和值都是一樣的,我不需要他們的結果集。

+0

是否意味着'LABEL'是兩個表中的主鍵(它不能是'NULL'並且它不能有在兩個表中的重複)? – mathguy

回答

1

這是解決這個問題的一種方法(也可能是最有效的方法)。主要部分是對結果執行UNION ALLGROUP BY的子查詢,僅保留由單個行組成的組。 (具有兩行的組是兩個表中存在相同行的組)。此方法由Marco Stefanetti發明 - 首先在AskTom討論板上討論。這種方法的好處 - 比較常見的「對稱差異」方法 - 是每個基表只讀取一次,而不是兩次。然後,爲了將結果置於所需格式,我使用了一個PIVOT操作(自Oracle 11.1起可用);在早期版本的Oracle中,可以使用標準的聚合外部查詢來完成相同的操作。

請注意,我修改了輸入以顯示VALUE列中的NULL的處理。

重要:此解決方案假定LABEL是兩個表中的主鍵;如果不是這樣,那麼所要求的輸出甚至是否有意義還不清楚。

with 
    table_a (label, value) as (
       select 'AAA', 3 from dual 
     union all select 'CCC', null from dual 
     union all select 'XXX', 5 from dual 
     union all select 'WWW', 7 from dual 
     union all select 'YYY', 2 from dual 
     union all select 'HHH', null from dual 
    ), 
    table_b (label, value) as (
       select 'ZZZ', 4 from dual 
     union all select 'AAA', 3 from dual 
     union all select 'HHH', null from dual 
     union all select 'WWW', 8 from dual 
     union all select 'XXX', 3 from dual 
     union all select 'CCC', 1 from dual 
    ) 
-- End of test data (NOT PART OF THE SOLUTION!) SQL query begins below this line. 
select a_label, a_value, b_label, b_value 
from (
     select max(source) as source, label as lbl, label, value 
     from  (
        select 'A' as source, label, value 
         from table_a 
        union all 
        select 'B' as source, label, value 
         from table_b 
       ) 
     group by label, value 
     having count(*) = 1 
     ) 
pivot (max(label) as label, max(value) as value for source in ('A' as a, 'B' as b)) 
; 

輸出

A_LABEL A_VALUE B_LABEL B_VALUE 
------- ------- ------- ------- 
YYY   2   
CCC    CCC   1 
WWW   7 WWW   8 
        ZZZ   4 
XXX   5 XXX   3