我似乎不明白为什么会发生这个错误。
下面是我的代码:
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
)
);错误出现在最后一行。
发布于 2012-12-26 14:16:00
有两个问题:
EXISTS中的子查询看不到表c,因此条件t.cid = c.cid is ORDER BY inside 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-26 14:28:11
您在和((sysdate - a.date_opened) > 365)中出错
像这样使用:-
和(sysdate - a.date_opened) > 365
发布于 2012-12-26 15:10:45
附注:您的子查询将需要对accounts进行全表扫描,即使您在date_opened上有一个索引,因为您在WHERE子句中进行数学运算。
对于每一行,Oracle都必须计算以下表达式:
((sysdate - a.date_opened) > 365)获取sysdate的值并减去打开的日期,然后将其与365进行比较。它必须单独检查每一行。
但是,如果将该表达式代数地更改为
sysdate - 365 > a.date_opened然后,它只需在查询开始时对表达式sysdate-365求值一次,然后将其与a.date_opened进行比较,并使用索引进行索引扫描。
https://stackoverflow.com/questions/13447099
复制相似问题