当in运算符不返回记录时返回null或0

时间:2014-01-22 20:53:05

标签: sql oracle

所以我试图在某些条件下从一个非常大的数据集聚合大量产品的总价值,并且想知道是否有一种方法可以返回null或0如果我的in运算符中有任何值没有回复记录。所以,假设我的查询设置如下(我道歉,因为我无法发布实际的表和列名称):

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 :(得分: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;

答案 1 :(得分:1)

如果这是Oracle,那么您可以使用分区外连接语法来执行此操作(称为数据密集化)。

最好的技术是将公用表表达式中的A,B,C,D,E表连接到另一个公用表表达式,在该表达式中为每个IN子句值生成一行。

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