2014-01-22 116 views
1

所以我试图在特定条件下从一个非常大的数据集中汇总大量产品的总价值,并想知道是否有办法返回null或0如果my in运算符中的任何值不返回记录,则返回0。所以我们可以说我的查询设置如下(我很抱歉,我不能张贴实际的表名和列名):当运营商没有返回记录时返回null或零

Select A.1, A.2, B.1, sum(D.1 * E.1) total 

from A, B, C, D, E 

where ... [a bunch of joins to connect the tables] 

and A.2 in ('aaaa', 'aaab', 'aaac', etc... many values are here) 

and ... [more parameters] 

在它返回我需要的所有数据的时刻,但是,我也很喜欢它在in运算符未找到匹配的列中返回具有null或0的行。另外,我的一个限制是我无法创建任何表格。

感谢

+2

这不是太清楚你问什么。也许你可以提供一些示例数据和预期输出? –

+0

某个地方缺少“GROUP BY”... – dasblinkenlight

回答

1

如果这是甲骨文,那么你可以使用分区外部联接语法来执行此操作(称为数据致密化)。

最好的方法是在公用表表达式中将A,B,C,D,E表和分区外连接之间的连接连接到另一个公用表表达式,其中为每个IN子句值生成一行。

在文档中查找分区外连接的指导和示例,还有关于规范化逗号分隔列表的其他问题。

2

这样做需要左外连接。这里有一个方法适合您的查询:

with list as (
     select 'aaaa' as name from dual union all 
     select 'aaab' from dual union all 
     . . . 
    ) 
Select A.1, l.name, B.1, sum(D.1 * E.1) total 
from list l left outer join 
    A 
    on l.name = A.2 . . . , B, C, D, E 
where ... [a bunch of joins to connect the tables] and 
     ... [more parameters]; 

我建议你改变你的语法使用标准join语法,而不是隐含在where连接。

您可以与您的查询直接做到这一点还有:

with list as (
     select 'aaaa' as name from dual union all 
     select 'aaab' from dual union all 
     . . . 
    ), 
    yourresults as (
     your query goes here 
    ) 
select yr.1, l.2, yr.3, total 
from list l left outer join 
    yourresults yr 
    on l.name = yr.2;