2016-11-22 72 views
0

公平的警告:我是使用SQL的新手。我通過AQT或SQL Developer在Oracle服務器上這樣做。SQL UNION ALL只包含來自'底部'表的更新條目

正如我一直沒能想到或搜索我的方式來回答,我把自己在你的手中能...

我想將數據從一個表合併(高質量數據)與來自表B(新數據)的數據相比較,使得來自B的條目僅在日期標記晚於表A可用時才包括。

這兩個表包括來自多個實體的條目,並且最新的日期標記隨着這些實體。

在一月4日,該表可能看起來像:

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 

我做了一些代碼,我希望澄清我的需要的嘗試:現在

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) 

,如果WHERE date > ALL (SELECT date FROM AA)會爲每個實體單獨工作,我認爲有我需要的。

也就是說,爲每個實體我想從B.

如表A中的數據從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); 

你可以,當然,你的熱膨脹係數運行此,如果這些是你真正想要的結合。

+0

聚合覆蓋單個日期上一個實體的所有值。使用表A,X在1. jan上有SUM(value)= 2。更重要的是:'select max(a.date)from ...'是否返回單個max_date?我想爲每個實體... – Kjetil

+0

@Kjetil。 。 。正如我在答案中所說的,只需使用您定義的CTE來運行它。 –

+0

我覺得有點不好意思,因爲我不知道max()可能會返回多個值。非常感謝你支持noob。 – 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

基本上你正在尋找在BB不AA中存在的條目。當你在做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)