0


我在 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'

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

如何实现正确的查询?

提前致谢...

4

2 回答 2

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) and 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'
于 2013-04-09T01:30:59.917 回答
0

将 where 子句移动到连接条件或将 or 添加到 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'
于 2013-04-09T01:31:37.097 回答