2016-11-22 5 views
0

公正な警告:SQLの使用は初めてです。 Oracleサーバーでは、AQTまたはSQL Developerのいずれかを使用して行います。私は、テーブルA(高品質データ)からのデータを結合したいSQL UNION ALLには、「ボトム」テーブルの新しいエントリのみが含まれます。

私は答えに私の方法を考えたり検索することができていないとして、私はあなたのことが手に自分を置く...

テーブルBからのデータ(新鮮なデータ)により、Bのエントリは、日付スタンプがテーブルAから入手可能なものよりも後に含まれるようになる。

両方のテーブルは複数のエンティティからのエントリを含み、それらの実体。場合は、

WITH 
AA AS 
(SELECT entity, date, SUM(value) 
FROM table_A 
GROUP BY 
entity, 
date), 

BB AS 
(SELECT entity, date, SUM(value) 
FROM table_B 
WHERE date > ALL (SELECT date FROM AA) 
GROUP BY 
entity, 
date 
) 

SELECT * FROM (SELECT * FROM AA UNION ALL SELECT * FROM BB) 

今:私は私の必要性を明確に願っていますいくつかのコードの試みを行っている

A____________________________   B_____________________________ 
entity date  type value   entity date  type value 
X  1.jan 1  1    X  1.jan 1  2 
X  1.jan 0  1    X  1.jan 0  2 
X  2.jan 1  1    X  2.jan 1  2 
Y  1.jan 1  1 (new entry)X  3.jan 1  1 
Y  3.jan 1  1    Y  1.jan 1  2 
             Y  3.jan 1  2 
          (new entry)Y  4.jan 1  1 

:1月4日に

、テーブルは次のように見えるかもしれませんWHERE date > ALL (SELECT date FROM AA)はそれぞれのエンティティごとに別々に動作しますが、私は必要なものを持っていると思います。テーブルAのデータは、多くの場合、Bのそれとは異なるので、私はすべてAからのエントリー、及びB.

からのみ、新しいエントリをしたい各エンティティのために、ある

(値は、多くの場合、修正されている)私はいけないと思う私は、次のようなものを使用できます:table A UNION ALL (table B MINUS table A)

おかげ

答えて

0

集計がどこから来ているのかわからないので、あなたの質問は混乱します。

table_bから新しい行を取得する上での基本的な考え方は、where句でこのような何かの条件を使用しています。それらは、あなたが本当に欲しいものであれば、

select . . . 
from table_a a 
union all 
select . . . 
from table_b b 
where b.date > (select max(a.date) from a where a.entity = b.entity); 

あなたは、もちろん、あなたのCTEでこれを実行することができますが結合します。

+0

集約は、単一の日付の1つのエンティティのすべての値を超えています。表Aを使用すると、Xは1. janでSUM(値)= 2となります。さらにポイント: 'select max(a.date)from ...'は単一のmax_dateを返しませんか?私は各エンティティのために1つをご希望です... – Kjetil

+0

@Kjetil。 。 。私が答えて言うように、あなたが定義したCTEを使ってこれを実行してください。 –

+0

私はmax()が複数の値を返すかもしれないことを知りませんでしたので、私は少し愚かであると感じます。騒ぎに乗ってくれてありがとう。 – Kjetil

0

利用UNION代わりのUNION ALL、それは

SELECT * FROM (
        SELECT * 
        FROM AA 
        UNION 
        SELECT * 
        FROM BB ) 
+0

この問題は、Aの古いエントリがBの古いエントリと同じではないということです(Aのデータはエラーやその他のものについてレビューされています)。 UNIONはどのように変更を無視することを知りますか? – Kjetil

+0

@ Kjetil Bの古いエントリがAと同じでない場合は、新しいエントリとみなす必要があります。 –

1

は基本的にあなたがAAに存在しないBBのエントリを探している重複レコードを削除します。 date > ALL (SELECT date FROM AA)を実行している場合、これは問題のエンティティを考慮に入れず、正しいレコードを取得しません。 代わりに、JOINを使用して、すべての一致するエントリをAAで除外します。

次のようなものです。

WITH 
AA AS 
(SELECT entity, date, SUM(value) 
FROM table_A 
GROUP BY 
entity, 
date), 

BB AS 
(SELECT entity, date, SUM(value) 
FROM table_B 
LEFT OUTER JOIN AA 
    ON AA.entity = BB.entity 
    AND AA.DATE = BB.date 
WHERE AA.date == null 
GROUP BY 
entity, 
date 
) 

SELECT * FROM (SELECT * FROM AA UNION ALL SELECT * FROM BB) 
関連する問題