oracle Webi中的Make NOT EXISTS子句

eit6fx6z  于 2023-05-16  发布在  Oracle
关注(0)|答案(1)|浏览(148)

我有一个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 INNOT EXISTS相同,因为宇宙中的记录复合体包括transaction_date(它基本上是Object_TableTransaction_Table的JOIN),所以我所要检查的是我当前记录上的日期(范围内的日期)没有超出范围。我确信这个过滤器子查询可以做更多的事情,但是我不理解它。
我找不到任何复杂的过滤器例子(尽管许多声称是“复杂的”-他们有3个“与”语句-哦哦哦!).
我认为这可以通过宇宙中的一个新维度[using MIN(Transaction_Date)]来实现,但这条道路对我来说是不可用的。
在我看来,如果没有这种类型的基本功能(至少在Oracle SQL中是基本的),这个WebI工具就会受到严重的限制。

mwyxok5s

mwyxok5s1#

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中复制这种逻辑可以通过一个子查询来完成。我在下面的截图中使用了我的宇宙,所以我的Session IdEvent IdEvent Date Local对应于你的object_table.keytransaction_table.keytransaction_table.date

如果必要的逻辑确实需要NOT EXISTS,那么就不能用WebI中的标准子查询来完成。但是,您可以通过在宇宙中创建一个预定义的条件来实现逻辑来欺骗。条件将包含查询中的整个NOT EXISTS子句;将其放入WebI中的查询中会将该子句添加到SQL。

相关问题