我有以下查询:
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)
上的每个表上进行索引。