2013-04-09 91 views
0


我在Oracle数据库中有2个表。其中一个包含静态数据,即info_table,另一个包含每日更新数据,即stats_tableinfo_table包含每个WCEL_ID(坐标等)的静态数据,并且每天自动更新stats_table
SQL,如果在指定日期没有数据,则返回行

有时,可能无法获取任何WCEL_ID的数据,因此在任何特定日期,任何WCEL_ID可能在stats_tabel中缺失。我的问题是,例如,当我查询一周的数据时,我只收到指定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'

这回只有一排,因为我们有a.WCEL_ID = '14000004554984' 6天没有数据,但我想有一行+6行,空值。

如何实现正确的查询?

在此先感谢...

回答

0

只需使用外连接,其次你需要穿上info_table,而不是统计数据表条件,因为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' 

注意我对“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' 
+0

了'period_start_time'字段只包含在'stats_table'实际。对于每个WCEL_ID,“info_table”都有多行/条目,但是'stats_table'对于每个WCEL_ID元素只有一个条目。 – 2013-04-09 02:13:26

+0

看到我编辑的查询,这应该解决您的问题。 – Lokesh 2013-04-09 04:11:15

+0

'period_start_time'字段不可用于'info_table'。实际上,'info_table'包含坐标,别名等静态数据......它是每个WCEL_ID具有多行(如果有特定WCEL_ID的数据,每天一行)的'stats_table',而'info_table'具有每个WCEL_ID都有一个条目,没有任何日期/时间信息。 – 2013-04-09 04:34:18

0

where子句移动到连接标准或添加或到和

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' 
+0

如果我们添加子句“和(a.WCEL_ID为空或a.WCEL_ID = '14 ....')”,那么对于WCEL_ID = null,什么值将来自info_table?我不认为这会奏效。你需要外部连接。 – Lokesh 2013-04-09 01:39:08

+0

感谢xQbert,但实际上并没有返回所需的结果。 – 2013-04-09 02:14:11

相关问题