首页 > 解决方案 > sql中是否存在将一个表的缺失数据填充到另一个表的连接?

问题描述

我想从我创建的日期表中填写一个表中缺少的日期。

我有所有日期的第一个表是这个:

Dates
01/11/2018
02/11/2018
03/11/2018

我的数据的第二个表是这个:

Name    Value   Date
Go        1     01/11/2018
Go        3     02/11/2018
Ma        2     03/11/2018

我的最终输出应该是这样的:

Name    Value   Date
Go        1     01/11/2018
Go        3     02/11/2018
Go      null    03/11/2018
Ma      null    01/11/2018
Ma      null    02/11/2018
Ma        2     03/11/2018

我尝试了一个完整的外部连接,但它没有用:

select b.name, a.d_date, b.value
from date_month a 
full outer join namevalue b on a.d_date=b.d_date;

datemonth 是带有日期的表,namevalue 是带有名称的表。包含名称的表至少包含 300,000 个名称以及日期和值。

标签: sqloracledatejoinouter-join

解决方案


分区外连接是填补稀疏数据空白的好方法。此连接允许我们根据列中的值重复连接。这种方法比常规外连接连接更多,但比交叉连接少得多,它应该比交叉连接解决方​​案更有效。

select name, value, dates.the_date
from dates
left join my_data
    partition by (my_data.name)
    on dates.the_date = my_data.the_date
order by name, the_date;

NAME  VALUE  THE_DATE
----  -----  --------
Go        1  2018-01-11
Go        3  2018-02-11
Go           2018-03-11
Ma           2018-01-11
Ma           2018-02-11
Ma        2  2018-03-11

示例架构:

create table dates as
select date '2018-01-11' the_date from dual union all
select date '2018-02-11' the_date from dual union all
select date '2018-03-11' the_date from dual;

create table my_data as
select 'Go' name, '1' value, date '2018-01-11' the_date from dual union all
select 'Go' name, '3' value, date '2018-02-11' the_date from dual union all
select 'Ma' name, '2' value, date '2018-03-11' the_date from dual;

推荐阅读