表1中没有数据时一个月来的表2中的数据

时间:2019-03-06 17:24:41

标签: oracle oracle11g oracle12c

我有两个表A和B。

  • 一个表有3个月的数据(每天都会添加,因此随着月份的增加,未来几个月还将添加更多数据)

&B表具有12个月的数据(全年)。

表A可能会遗漏一个月的数据,例如,在我的情况下,Jan没有一个ID的任何数据,但是到2月,它具有相同ID的一些数据。

当我进行左联接时,我丢失了表2中1个ID的数据,因为表中没有ID 1的数据。

当我进行正确的联接时,我将获得表2的12个月数据,因此在这种情况下应用的联接条件month(table A. date)=month(table B. date)也会从表2中丢失ID 1的数据。

我的要求是从表1和表2中获取表1中月份的数据,如果表没有特定月份的数据(例如1月),那么我也需要表2中1月的数据。

表1

ID Date         value

1  01-Feb-2019  100
2  01-Jan-2019  101
2  01-Feb-2019  102

表2

ID Date         value
1  01-Jan-2019  101
1  01-Feb-2019  100
1  01-Mar-2019  100
2  01-Jan-2019  101
2  01-Jan-2019  101
2  01-Feb-2019  102
2  01-Mar-2019  100
      .
      .
      .

This continues till dec 2019  

在上面的示例数据中,我没有从表2中获得1月的数据。

预期输出:

ID  Jan  Feb  Mar
1   101  201  100  //Here Jan value from table2
2   201  204  100

3 个答案:

答案 0 :(得分:0)

改为尝试UNION

select * from table A where Date between to_date('2019-01-01 00:00:00', 'YYYY.MM.DD HH24:MI:SS') and to_date('2019-01-31 23:59:59', 'YYYY.MM.DD HH24:MI:SS')
    union
select * from table B where Date between to_date('2019-01-01 00:00:00', 'YYYY.MM.DD HH24:MI:SS') and to_date('2019-01-31 23:59:59', 'YYYY.MM.DD HH24:MI:SS');

答案 1 :(得分:0)

由于没有显示给出期望输出的实际查询,因此不确定如何提取值。

此查询似乎可以正常工作,即它可以提供您最初想要的内容。

select  t2.id,t2.dt,coalesce(t1.value,t2.value) as value 
from t2  LEFT JOIN t1 ON
    to_char(t1.dt,'yyyymm') = to_char(t2.dt,'yyyymm') and
    t1.id = t2.id
  ORDER BY id,dt

如果添加DISTINCT,则要删除重复项,每个id,month组合将获得一个条目。您也可以进行group by id或任何您希望进行聚合的操作

请注意,仅当您要使用表1的值而不是表2的值时,或者仅从t2中选择行就足够了

coalesce(t1.value,t2.value) as value 

Demo

答案 2 :(得分:0)

如果查询工具中存在此类限制,则最好在数据库中创建一个将表合并在一起的视图,然后查询该视图。

create view A_B as

从表A中选择ID和日期值     联盟 从表B中选择ID和日期值;