0

我似乎无法弄清楚为什么会发生此错误。

这是我的代码:

SELECT DISTINCT c.cid 
  FROM customers c
 WHERE EXISTS ( SELECT DISTINCT t.aid 
                  FROM transactions t
                 WHERE EXISTS ( SELECT a.balance 
                                  FROM accounts a 
                                 WHERE t.cid = c.cid
                                   AND a.aid = t.aid
                                   AND ((sysdate - a.date_opened) > 365)
                                 ORDER BY a.balance DESC
                               )
              );

错误在最后一行。

4

3 回答 3

1

有2个问题:

  1. 您不能从不是直接父级别的子查询中引用表 - 内部的子查询EXISTS看不到表c,因此条件t.cid = c.cid错误
  2. 我在ORDER BY内部EXISTS子查询中看不到任何含义。它也可能是非法的,但我不确定。

我建议您将查询从 2 重写EXISTS为 2 JOINS。就像:

SELECT cid 
  FROM (SELECT c.cid, a.balance
          FROM customers c,
               accounts a,
               transactions t 
         WHERE t.cid = c.cid
           AND a.aid = t.aid
           AND sysdate - a.date_opened > 365)
 ORDER BY balance DESC
于 2012-12-26T06:16:00.497 回答
0

旁注:您的子查询将需要对 进行全表扫描accounts,即使您在 上有索引date_opened,因为您正在 WHERE 子句中进行数学运算。

对于每一行,Oracle 都必须计算这个表达式:

((sysdate - a.date_opened) > 365)

取值sysdate并减去打开的日期,然后将其与 365 进行比较。它必须单独检查每一行。

但是,如果您以代数方式将该表达式更改为

sysdate - 365 > a.date_opened

那么它只需要sysdate-365在查询开始时评估一次表达式,然后可以将其与索引进行比较a.date_opened并使用索引进行索引扫描。

于 2012-12-26T07:10:44.740 回答
0

您在AND ((sysdate - a.date_opened) > 365)中犯了错误

像这样使用:-

AND (sysdate - a.date_opened) > 365

于 2012-12-26T06:28:11.450 回答