bobj / webi mimc oracle不存在

时间:2017-09-06 22:45:33

标签: sap business-objects

我有一个Oracle查询需要在WebI中重写。我无法弄清楚如何模仿" NOT EXISTS"来自Oracle。如果对象在给定时间范围内具有事务日期,则返回该对象,但如果该对象在该时间帧之前具有任何内容,则返回该对象。就是这样:

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联系起来,或者如何模仿那个&#34; NOT EXISTS&#34;。我不认为&#34; NOT IN&#34;与&#34; NOT EXISTS&#34;相同因为Universe中的记录复合体包含transaction_date(它基本上是Object_Table和Transaction_Table的JOIN),所以我要检查的是我在当前记录上的日期(范围内的日期) )不在范围之外。我确定这个过滤子查询可以做得更多,但我不理解它。

我找不到任何复杂的过滤器示例(尽管许多声称是&#34;复杂&#34; - 他们有3&#34; AND&#34;语句 - oooohhhh!)。

我认为可以通过宇宙中的新维度[使用MIN(Transaction_Date)]来完成,但是我无法使用该路径。

在我看来,如果没有这种类型的基本功能(至少它是Oracle SQL中的基本功能),这个WebI工具受到严重限制。

1 个答案:

答案 0 :(得分:0)

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中。