Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORA-00907:缺少右括号_Sql_Oracle - Fatal编程技术网

Sql ORA-00907:缺少右括号

Sql ORA-00907:缺少右括号,sql,oracle,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

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

这是我的密码:

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
                               )
              );
错误在最后一行。

有两个问题:

  • 不能从非直接父级的子查询中引用表-存在
    中的子查询未看到表
    c
    ,因此条件
    t.cid=c.cid
    是错误的
  • 我看不到
    orderby
    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
    

    您在和((sysdate-a.date\u opened)>365)中犯了错误

    这样使用:-


    和(sysdate-a.date\u opened)>365

    旁注:您的子查询将需要对
    帐户进行完整的表扫描,即使您在
    date\u opened
    上有索引,因为您在WHERE子句中进行数学运算

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

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

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

    sysdate - 365 > a.date_opened
    

    然后它只需在查询开始时计算表达式
    sysdate-365
    一次,然后将其与
    a.date\u opened
    进行比较,并使用索引进行索引扫描。

    看起来是因为您的
    ORDER BY
    位于内部
    EXISTS()
    中。将
    ORDER BY
    移动到顶层。子查询中的ORDER BY子句没有多大用处,只会增加执行时间,因此是不允许的。我不知道这是不允许的。谢谢