2017-06-08 91 views
2

我有一個查詢與Oracle中的一個CTE中的聯合。我試圖在我們的數據庫中獲得一個名爲P的字段的總和,並在我寫作我的視圖時檢查以確保該值是準確的。我發現甲骨文在處理一個不尋常的方式將這些查詢加入工會CTE中的聯盟刪除記錄,但沒有重複

with CTE_A as 
(select P, 'full' as coverage from Table_A), 

CTE_B as 
(select P, 'partial' as coverage from Table_A) 

在這裏,如果我select sum(P) from CTE_A我得到100。但是,如果我後執行下列操作:

CTE_C as 
(select P, coverage from CTE_A 

union 

select P, coverage from CTE_B) 

select sum(P) from CTE_C where coverage='full' 

我得到78

當我使用union時,我再次得到100。我知道聯合會刪除重複項,但是CTE_A和CTE_B中應該沒有重複項,因爲我聲明瞭現場報道。

+4

UNION刪除**所有**重複項,包括那些已經存在於每個操作數(表)中的重複項 - 而不僅僅是那些在表之間重複的重複項。 – mathguy

回答

4

UNION將刪除結果集中的重複項。您必須在CTE_A是這樣的:

22 | Full 
22 | Full 

,當你SUM() CTE_A,都被計算在內。但是在UNION之後,您只會有一條記錄,將總計從CTE_C降至78(100-22=78)的總數爲SUM()

UNION ALL不刪除重複項,這就是爲什麼當您包括ALL時不會發生這種情況。

+1

噢!這是有道理的...非常感謝你讓我瘋狂。 – Magnolia

+2

@Magnolia - 如果這是答案(它是100%),您應該將答案標記爲「正確」。 (除非 - 我不記得那個 - 也許如果你是一個全新的用戶,你只能在24小時後這樣做,如果是這樣的話,請做一個記錄回來並且以這種方式標記答案。) – mathguy