這是解決這個問題的一種方法(也可能是最有效的方法)。主要部分是對結果執行UNION ALL
和GROUP 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
是否意味着'LABEL'是兩個表中的主鍵(它不能是'NULL'並且它不能有在兩個表中的重複)? – mathguy