我正在尝试运行一个报告,以显示过去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中日期范围内所有值的第一条记录。如何正确加入这两个表?
由于
答案 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