SQL,如果指定日期没有数据,则返回行

时间:2013-04-09 01:20:36

标签: sql oracle join


我在Oracle DB中有2个表。一个包含静态数据info_table,另一个包含每日更新数据stats_tableinfo_table包含每个WCEL_ID(坐标等等)的静态数据,stats_table每天都会自动更新。

有时候,任何WCEL_ID都没有数据,因此在任何特定日期,stats_tabel中都可能缺少任何WCEL_ID。我的问题是,当我查询一周的数据时,我只获取指定WCEL_ID在stats_table中有条目的日期的数据,但如果没有特定数据,我想获得null日期。 以下是我的查询

select *
FROM stats_table a full join info_table e
on a.WCEL_ID = e.WCEL_ID
where
a.period_start_time >= Trunc(sysdate-7) and a.WCEL_ID = '14000004554984'

这只返回一行,因为我们在6天没有a.WCEL_ID = '14000004554984'的数据,但是我希望有一行+6行有空。

如何实现正确的查询?

提前致谢...

2 个答案:

答案 0 :(得分:0)

只需使用外连接,其次你需要在info_table而不是stats表上放置条件,因为stats_table的数据较少[,所以我会写这样的查询:

select *
FROM stats_table a, info_table e
where a.WCEL_ID(+) = e.WCEL_ID
and e.period_start_time >= Trunc(sysdate-7) and e.WCEL_ID = '14000004554984'

请注意我对“and e.period_start_time> = Trunc(sysdate-7)和e.WCEL_ID ='14000004554984'”所做的调整,这基于假设info_table包含所有数据并且stats_table可能丢失您所说的数据。

编辑:用户评论后编辑了查询

select *
    FROM stats_table a, info_table e
    where a.WCEL_ID(+) = e.WCEL_ID
    and a.period_start_time >= Trunc(sysdate-7) and e.WCEL_ID = '14000004554984'

编辑:

第二个想法我认为查询不完整,在info_table中必须有一个日期列,否则你不能按2个表中的日期行映射数据[没有这个你无法实现你想要的]。采取这种假设,我正在修改查询如下:

select *
    FROM stats_table a, info_table e
    where a.WCEL_ID(+) = e.WCEL_ID
    and e.period_start_time >= Trunc(sysdate-7) and e.WCEL_ID = '14000004554984'
    and a.period_start_time(+) = e.period_start_time 

编辑:  我现在明白你的意思了。您希望每天都有一行,如果当天有数据,则应显示该行,否则应为null。我修改了我的逻辑以包含一个嵌套查询[有别名b],它将为过去7天的每一天生成行,并将它放在与主表的外连接中。试试这个,让我知道它是否能解决你的问题。

SELECT * 
FROM stats_table a,
  info_table e,
  (SELECT to_date(sysdate-7,'dd-mon-yyyy') +rownum dates
  FROM all_objects
  WHERE rownum <= to_date(sysdate,'dd-mon-yyyy')-to_date(sysdate-7,'dd-mon-yyyy')
  ) b
WHERE a.WCEL_ID            = e.WCEL_ID
AND a.period_start_time(+) = b.dates
AND a.WCEL_ID              = '14000004554984'

答案 1 :(得分:0)

将where子句移动到连接条件或向and和

添加一个或

and (a.WCEL_ID is null OR a.WCEL_ID = '14....')

select *
FROM stats_table a full join info_table e
on a.WCEL_ID = e.WCEL_ID
and a.period_start_time >= Trunc(sysdate-7) and a.WCEL_ID = '14000004554984'