Sql 当in运算符不返回记录时,返回null或零

Sql 当in运算符不返回记录时,返回null或零,sql,oracle,Sql,Oracle,因此,我试图在某些条件下从一个非常大的数据集中聚合大量乘积的总值,并想知道如果in运算符中的任何值不返回记录,是否有方法返回null或0。假设我的查询设置如下(很抱歉,我无法发布实际的表名和列名): 目前,它返回我需要的所有数据,但是,我也希望它在in运算符找不到匹配项的列中返回null或0的行。另外,我的一个限制是无法创建任何表 谢谢如果这是Oracle,那么您可以使用分区外部联接语法来执行此操作(称为数据加密) 最好的技术是在公共表表达式中的A、B、C、D、E表之间进行联接,并将分区外部联接

因此,我试图在某些条件下从一个非常大的数据集中聚合大量乘积的总值,并想知道如果in运算符中的任何值不返回记录,是否有方法返回null或0。假设我的查询设置如下(很抱歉,我无法发布实际的表名和列名):

目前,它返回我需要的所有数据,但是,我也希望它在in运算符找不到匹配项的列中返回null或0的行。另外,我的一个限制是无法创建任何表


谢谢

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

最好的技术是在公共表表达式中的A、B、C、D、E表之间进行联接,并将分区外部联接到另一个公共表表达式,在该表达式中,为每个in子句值生成一行


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

这样做需要左外部联接。以下是一种适合您的查询的方法:

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;

你要什么还不太清楚。也许您可以提供一些示例数据和预期输出?某个地方缺少了一个
groupby
。。。
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;