我有一个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工具受到严重限制。
答案 0 :(得分:0)
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中。