2014-01-22 155 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;