2017-04-23 54 views
0

我有以下疑问:其他有效的方式来写多个选择

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

尝试使用工会 – gaganshera

+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)上的每个表上的索引。

+0

Gordon,但这仍然与原始查询几乎相同,它是在几年前建立的,我认为这可能是一些不同的方式,例如不尝试重复白天,所有3个子查询等都是一样的。 –

+0

@JoeGreen。 。 。这不完全一样的逻辑。如果任何子查询不返回任何行,则原始查询将不返回任何行。 –

+0

戈登,让我们说它不会是零记录,并期望结果无论如何将使用连接查询什么? –

相关问题