我有一个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工具将受到严格限制。
您正确地认为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中复制此逻辑可以通过子查询来完成。我将Universe用于以下屏幕截图,因此我的Session Id
,Event Id
和Event Date Local
与您的object_table.key
,transaction_table.key
和transaction_table.date
相对应。
如果必要的逻辑实际上确实需要NOT EXISTS
,则无法使用WebI中的标准子查询来完成。但是,您可以通过在Universe中创建预定义条件来实施逻辑来作弊。条件将包含查询中的整个NOT EXISTS
子句;将其放入WebI的查询中会将子句添加到SQL。