ORA-00907:缺少右括号

时间:2012-11-19 03:07:34

标签: sql oracle

我似乎无法弄清楚为什么会出现这种错误。

这是我的代码:

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
                               )
              );

错误在最后一行。

3 个答案:

答案 0 :(得分:1)

有两个问题:

  1. 您不能从子查询中引用不是直接父级别的表 - EXISTS内的子查询没有看到表c,因此条件t.cid = c.cid错误
  2. 我在ORDER BY子查询中的EXISTS中看不到任何含义。它也可能是非法的,但我不确定。
  3. 我建议您将查询从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
    

答案 1 :(得分:0)

你在 AND((sysdate - a.date_opened)> 365)

中做错了

像这样使用: -

AND(sysdate - a.date_opened)> 365

答案 2 :(得分:0)

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

对于每一行,Oracle必须评估此表达式:

((sysdate - a.date_opened) > 365)

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

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

sysdate - 365 > a.date_opened

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