我有以下问题:
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个子查询),假设在所选日期的任何这些表中并不总是存在数据?我认为这可能是加入但不确定。
感谢, 小号
答案 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)
上每个表的索引。