我在Oracle DB中有2个表。一个包含静态数据info_table
,另一个包含每日更新数据stats_table
。 info_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行有空。
如何实现正确的查询?
提前致谢...
答案 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'