Oracle显示范围内的所有日期并加入另一个表

时间:2014-03-05 21:39:52

标签: sql oracle date join

我正在尝试运行一个报告,以显示过去90天内所有日期的列表,然后将其重新连接到另一个表中,该表具有一列中的日期和另一列中的补充数据。以下是我获取范围内所有日期的方法:

 select trunc(sysdate-90) + rownum -1 from all_objects where rownum <=90

问题是在日期将其加入另一个表。如果我跑:

 select trunc(sysdate-90) + rownum -1, t.col2 from all_objects
 left join (select date, col2 from table) t on trunc(sysdate-90) + rownum -1 = t.date
 where rownum <=90

然后它只显示t.col2中日期范围内所有值的第一条记录。如何正确加入这两个表?

由于

2 个答案:

答案 0 :(得分:5)

获得前90天的更好方法是使用dual / connect by技巧:

select trunc(sysdate-level) as the_date from dual connect by level <= 90

现在,您应该可以执行以下操作:

select the_date, t.col2
from (select trunc(sysdate-level) as the_date from dual connect by level <= 90) date_tbl
left join t on date_tbl.the_date = t.date

答案 1 :(得分:3)

不要使用all_objects,这在性能方面是一个非常糟糕的主意,而且你的DBA会想要把你串起来。我不知道这个使用all_objects的想法来自哪里,但我希望它会死!

为了获得日期列表,您可以实现更简单,更快速的SQL:

SELECT TRUNC( SYSDATE ) - ROWNUM a_date
FROM DUAL
CONNECT BY ROWNUM <= (the number of days you want)

如果您想要偏移,可以添加

SELECT TRUNC( SYSDATE ) - ROWNUM + (the offset) a_date
FROM DUAL
CONNECT BY ROWNUM <= (the number of days you want)

如果你想要一个不同的订单,你可以在另一个选择中包装,然后再订购:

SELECT a_date
FROM   (
  SELECT TRUNC( SYSDATE ) - ROWNUM + (the offset)
  FROM DUAL
  CONNECT BY ROWNUM <= (the number of days you want)
)
ORDER BY a_date ASC

然后,您可以将其嵌入到现有语句中,同时请记住您在子选择中需要它。这样做的原因是您的ROWNUM值不会混淆:

SELECT t.date, t.col_2
FROM    ( SELECT TRUNC( SYSDATE ) - ROWNUM a_date
          FROM DUAL
          CONNECT BY ROWNUM <= 90 ) date_list
LEFT JOIN table t ON date_list.a_date = t.date
ORDER BY a_date DESC