首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-00907:缺少右括号

ORA-00907:缺少右括号
EN

Stack Overflow用户
提问于 2012-11-19 11:07:34
回答 3查看 1.4K关注 0票数 0

我似乎不明白为什么会发生这个错误。

下面是我的代码:

代码语言:javascript
复制
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
                               )
              );

错误出现在最后一行。

EN

回答 3

Stack Overflow用户

发布于 2012-12-26 14:16:00

有两个问题:

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

我建议你把查询从2个EXISTS重写成2个JOINS。它将如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-12-26 14:28:11

您在和((sysdate - a.date_opened) > 365)中出错

像这样使用:-

和(sysdate - a.date_opened) > 365

票数 0
EN

Stack Overflow用户

发布于 2012-12-26 15:10:45

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

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

代码语言:javascript
复制
((sysdate - a.date_opened) > 365)

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

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

代码语言:javascript
复制
sysdate - 365 > a.date_opened

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13447099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档