Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL,如果指定日期中没有数据,则返回行_Sql_Oracle_Join - Fatal编程技术网

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

SQL,如果指定日期中没有数据,则返回行,sql,oracle,join,Sql,Oracle,Join,我在Oracle数据库中有两个表。一个包含静态数据,即info_表,另一个包含每日更新的数据,即stats_表。info_表包含每个WCEL_ID坐标等的静态数据,统计表每天都会自动更新 有时,可能无法获取任何WCEL_ID的数据,因此在任何特定日期,统计表中都可能缺少任何WCEL_ID。我的问题是,例如,当我查询一周的数据时,我只获取指定的WCEL_ID在stats_表中有一个条目的天数的数据,但如果没有特定日期的数据,我希望获取null。 下面是我的问题 挑选* 从统计表a到完整连接信息表e

我在Oracle数据库中有两个表。一个包含静态数据,即info_表,另一个包含每日更新的数据,即stats_表。info_表包含每个WCEL_ID坐标等的静态数据,统计表每天都会自动更新

有时,可能无法获取任何WCEL_ID的数据,因此在任何特定日期,统计表中都可能缺少任何WCEL_ID。我的问题是,例如,当我查询一周的数据时,我只获取指定的WCEL_ID在stats_表中有一个条目的天数的数据,但如果没有特定日期的数据,我希望获取null。 下面是我的问题

挑选* 从统计表a到完整连接信息表e 在a.WCEL_ID=e.WCEL_ID上 哪里 a、 时段开始时间>=Truncsysdate-7和a.WCEL\u ID='1400004554984'

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

如何实现正确的查询


提前感谢…

只需使用外部联接,其次,您需要在info_表上设置条件,而不是在stats表上设置条件,因为stats_表的数据较少[,因此我将编写如下查询:

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>=Truncsysdate-7和e.WCEL_ID='1400004554984'所做的更改,这是基于这样的假设,即info_表包含所有数据,stats_表可能缺少您所述的数据

编辑:在用户的评论编辑查询之后

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_表中必须有一个日期列,否则您无法在两个表中按日期行映射数据[如果没有这一点,您将无法实现您想要的结果]。基于这一假设,我正在修改查询,如下所示:

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'

将where子句移动到联接条件,或将or添加到and

并且a.WCEL_ID为null或a.WCEL_ID='14..'


如果我们添加该子句,并且a.WCEL_ID为null或a.WCEL_ID='14….'那么对于WCEL_ID=null,info_表的值将是多少?我认为这不起作用。您需要外部联接。谢谢xQbert,但这实际上并没有返回所需的结果。时段开始时间字段实际上只包含在stats_表中。info_表有多行/每个WCEL_ID的条目,但是stats_table对于每个WCEL_ID元素只有一个条目。period_start_time字段对于info_table不可用。实际上,info_table保存静态数据,如坐标、别名等。如果每个WCEL_ID都有特定WCEL_ID的数据,则stats_table每天有一行,然而,info_表中每个WCEL_ID有一个条目,没有任何日期/时间信息。感谢更新lpki,但查询实际上没有返回任何行。您确实有这个逻辑。问题是,如果没有任何特定日期的数据,至少对我来说是困难的,那么我们必须检测到今天没有数据,并返回null。
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'