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
子查询的任何含义。这也可能是违法的,但我不确定EXISTS
重写为2JOINS
。就像:
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子句没有多大用处,只会增加执行时间,因此是不允许的。我不知道这是不允许的。谢谢