与缺少行

时间:2016-03-10 20:24:47

标签: sql sql-server oracle left-join

我有一个表格,其中包含给定日期的信息。我有第二张表,其中包含某些日期的附加信息。不幸的是,第二个表没有第一个表中每个日期的信息。

现在,我希望能够使用第二个表中的信息加入我的第一个表,但是当第二个表中缺少其他信息时,我想将其与之前日期或之前的日期信息一起加入那个,最多可以说是7天。

我不知道如何在没有带有max()函数的subselect的情况下解决这个问题,而max()函数的性能非常糟糕。

我会尝试用一个简单的例子说明我的问题:

create table lookups
(
    date_value date not null,
    additional_information nvarchar(10)
)

create table master
(
    date_value date not null,
    information nvarchar(10)
)

insert into master(date_value, information) 
values (convert(date, '20160101', 112), 'one');

insert into master(date_value, information) 
values (convert(date, '20160102', 112), 'two');

insert into master(date_value, information) 
values (convert(date, '20160104', 112), 'three');

insert into master(date_value, information) 
values (convert(date, '20160112', 112), 'three');

insert into lookups(date_value, additional_information) 
values (convert(date, '20160101', 112), 'plus ONE');

insert into lookups(date_value, additional_information) 
values (convert(date, '20160102', 112), 'plus TWO');

现在,为了获得更多信息,我目前正在采取以下措施:

SELECT *
FROM master

SELECT *
FROM lookups

SELECT 
    *,
    (SELECT additional_information
     FROM lookups
     WHERE date_value = (SELECT MAX(date_value)
                         FROM lookups
                         WHERE date_value <= master.date_value
                           AND date_value >= dateadd(d, -10, master.date_value))
    )
FROM master

我得到了

date_value information
---------- -----------
2016-01-01 one
2016-01-02 two
2016-01-04 three
2016-01-12 three

(4 row(s) affected)

date_value additional_information
---------- ----------------------
2016-01-01 plus ONE
2016-01-02 plus TWO

date_value information 
---------- ----------- ----------
2016-01-01 one         plus ONE
2016-01-02 two         plus TWO
2016-01-04 three       plus TWO

我希望你们中的一些人可以帮助我找到一个更优雅,更重要的更快的解决方案。

虽然示例是在SQL Server上,但实际上我正在寻找一种适用于Oracle的解决方案。

1 个答案:

答案 0 :(得分:0)

我可能错了,但如果您只是想从查找中获取最近7天的数据,为什么不写下面的内容。

select * 
from master m 
left outer join lookups l on nvl(m.date_value,'null') =  nvl   (l.date_value,'null')
where  (TRUNC(SYSDATE - 7) <= (l.date_value))