编写多个选择的其他有效方法



我有以下查询:

select * from 
  ( select volume as vol1 from table1 where code='A1' and daytime='12-may-2012') a,
  ( select volume as vol2 from table2 where code='A2' and daytime='12-may-2012') b,
  ( select volume as vol3 from table3 where code='A3' and daytime='12-may-2012') c

结果:

vol1 vol2 vol3
20   45    

假设在选定日期中,这些表中的任何一个表中都不存在数据,那么编写此查询的其他有效方法是什么?我认为可能会加入,但不确定。

谢谢S

如果担心数据可能不存在,则交叉加入不是正确的操作员。如果任何子查询返回零行,则将获得一个空结果集。

假设每个查询最多都会返回一排,只需在select中使用子查询:

select (select volume from table1 where code = 'A1' and daytime = date '2012-05-12') as vol1,
       (select volume from table2 where code = 'A2' and daytime = date '2012-05-12') as vol2,
       (select volume from table3 where code = 'A3' and daytime = date '2012-05-12') as vol3
from dual;

如果缺少一个值,则为NULL。如果子查询返回多个行,则您会遇到错误。

我更喜欢ANSI标准格式,这就是为什么我使用date关键字。

我高度怀疑将称为datetime的字段与没有时间组件的日期常数进行比较。我会仔细检查一下逻辑。也许您打算trunc(daytime) = date '2012-05-12'或类似的东西。

我还应该注意,如果性能是一个问题,则您需要在(code, daytime, volume)上的每个表上进行索引。

相关内容

最新更新