写多个select的其他有效方法

时间:2017-04-23 13:48:47

标签: sql oracle oracle11g

我有以下问题:

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    

编写此查询的其他有效方法是什么(在实际情况下,最多可能有15个子查询),假设在所选日期的任何这些表中并不总是存在数据?我认为这可能是加入但不确定。

感谢, 小号

1 个答案:

答案 0 :(得分:0)

如果担心数据可能不存在,那么交叉连接不是正确的运算符。如果任何子查询返回零行,那么您将获得一个空结果集。

假设每个查询最多返回一行,只需使用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)上每个表的索引。