Webi中的NOT EXISTS子句

问题描述 投票:1回答:1

我有一个Oracle查询,需要在WebI中重写。我无法弄清楚如何模仿Oracle的“ NOT EXISTS”。如果查询的交易日期在给定的时间范围内,则查询返回一个对象,但在该时间帧之前的任何日期则不返回。也就是说,类似于:

SELECT Object_Number 
     , Transaction_Date 
     , <other fields>
FROM Object_Table 
INNER JOIN Transaction_Table   ON  Transaction_Table.Key = Object_Table.Key
WHERE Transaction_Table.Date BETWEEN '2017-07-01' AND '2017-01-31' 
AND NOT EXISTS (SELECT 1 FROM Transaction_Table  
                WHERE Transaction_Table.Key = Object_table.Key 
                AND   Transaction_Table.Date < '2017-07-01' 
               ) 

有点复杂,但这是一个很好的近似值。

我以为我可以使用子查询过滤器,但是我没有看到如何将该子查询绑定到原始Object_Number或如何模仿该“ NOT EXISTS”。我认为“ NOT IN”与“ NOT EXISTS”并不相同,因为Universe中的记录复合体包含transaction_date(基本上是Object_Table和Transaction_Table的JOIN),因此我要检查的是我当前记录中的日期(范围内的日期)不在范围内。我确信这个过滤器子查询可以做更多的事情,但是我不理解。

我找不到任何复杂的过滤器示例(尽管许多声称是“复杂”的过滤器示例-它们有3个“ AND”语句-oooohhhh!)。

我认为可以使用[使用MIN(Transaction_Date)]在宇宙中使用新的维度来完成,但该路径对我不可用。

在我看来,如果没有这种基本功能(至少在Oracle SQL中是基本功能),此WebI工具将受到严格限制。

oracle sap business-objects not-exists webi
1个回答
1
投票

您正确地认为NOT EXISTSNOT IN不同,但是在您的示例代码中,任何一个都可以使用。可以用NOT IN重写查询,如下所示:

SELECT Object_Number 
     , Transaction_Date 
     , <other fields>
FROM Object_Table 
INNER JOIN Transaction_Table   ON  Transaction_Table.Key = Object_Table.Key
WHERE Transaction_Table.Date BETWEEN '2017-07-01' AND '2017-01-31' 
      AND object_table.key NOT IN 
          (SELECT transaction_table.key
             FROM transaction_table
            WHERE transaction_table.date < '2017-07-01'

并在WebI中复制此逻辑可以通过子查询来完成。我将Universe用于以下屏幕截图,因此我的Session IdEvent IdEvent Date Local与您的object_table.keytransaction_table.keytransaction_table.date相对应。

enter image description here

如果必要的逻辑实际上确实需要NOT EXISTS,则无法使用WebI中的标准子查询来完成。但是,您可以通过在Universe中创建预定义条件来实施逻辑来作弊。条件将包含查询中的整个NOT EXISTS子句;将其放入WebI的查询中会将子句添加到SQL。

© www.soinside.com 2019 - 2024. All rights reserved.