1

我有一个需要在 WebI 中重写的 Oracle 查询。我无法弄清楚如何模仿 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 联系起来,或者如何模仿“不存在”。我不认为“NOT IN”与“NOT EXISTS”相同,因为宇宙中的记录复合体包括 transaction_date(它基本上是 Object_Table 和 Transaction_Table 的 JOIN),所以我要检查的是我当前记录中的日期(范围内的日期)不在范围之外。我确信这个过滤子查询可以做更多,但我不理解它。

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

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

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

4

1 回答 1

1

您是正确的,NOT EXISTS与 不同NOT 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 Id、、和Event Date Local对应于你的object_table.key、、transaction_table.keytransaction_table.date

在此处输入图像描述

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

于 2017-09-07T11:58:08.027 回答