SQL UNION ALL仅包含来自“bottom”表的较新条目

时间:2016-11-22 12:15:01

标签: sql oracle union

公平警告:我是使用SQL的新手。我是通过AQT或SQL Developer在Oracle服务器上完成的。

由于我无法思考或搜索答案,我把自己放在你能干的手中......

我想将表A(高质量数据)中的数据与表B中的数据(新数据)结合起来,这样只有当日期戳晚于表A中可用的日期时,才包括B中的条目。 / p>

两个表都包含来自多个实体的条目,最新的日期戳随这些实体而变化。

1月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)单独为每个实体工作,我认为有我需要的。

也就是说,对于每个实体,我想要所有来自A的条目,只有来自B的新条目。

由于表A中的数据经常与B的数据不同(值经常被更正)我不认为我可以使用类似:table A UNION ALL (table B MINUS table A)的内容?

由于

3 个答案:

答案 0 :(得分:1)

基本上,您正在寻找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)

答案 1 :(得分:0)

使用UNION代替UNION ALL,它会删除重复的记录

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

答案 2 :(得分: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上运行此操作,如果这些是您真正希望合并的那些。