我有两个表A和B。
&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
答案 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
答案 2 :(得分:0)
如果查询工具中存在此类限制,则最好在数据库中创建一个将表合并在一起的视图,然后查询该视图。
create view A_B as
从表A中选择ID和日期值 联盟 从表B中选择ID和日期值;