2017-06-08 17 views
2

oracleのCTE内に共用体を持つ問合せがあります。私はデータベースにPというフィールドの合計を取得しようとしていて、自分の見解を書いていたときに値が正確であることを確認していました。レコードを削除しても重複はありません

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

を得る:私は、私は次の操作を行う場合は、しかし、100を取得 select sum(P) from CTE_A場合はここで組合

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

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

を追加した後に異常な方法でこれらのクエリを処理するOracleのを見つけました

私がユニオンを使用すると、私は再び100を得ます。私は組合が重複を削除することを知っていますが、フィールドカバレッジを宣言しているので、CTE_AとCTE_Bの中に重複はありません。

+4

UNIONは、各オペランド(テーブル)内にすでに存在するものを含む**すべての**重複を削除します - テーブル間の重複*だけでなく、 – mathguy

答えて

4

UNIONは、結果セットから重複を削除しています。あなたはCTE_Aにこのような何かを持っている必要があります。

22 | Full 
22 | Full 

どの、あなたSUM() CTE_A、両方がカウントされます。しかし、UNIONの後には、SUM()の合計をCTE_Cから78(100-22=78)に下げるレコードが1つしかありません。

UNION ALL重複が削除されないため、ALLを含めるとこの現象は発生しません。

+1

ああ!それは意味をなさない...そんなにナットを運転してくれてありがとう。 – Magnolia

+2

@Magnolia - これが答え(100%)であれば、答えを「正解」とマークする必要があります。 (もし私が覚えていないのであれば、まったく新しいユーザーであれば、24時間後にのみそれを行うことができますか?そうなら、戻ってその答えに印を付けてください。) – mathguy

関連する問題