我似乎无法弄清楚为什么会出现这种错误。
这是我的代码:
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
)
);
错误在最后一行。
答案 0 :(得分:1)
有两个问题:
EXISTS
内的子查询没有看到表c
,因此条件t.cid = c.cid
错误ORDER BY
子查询中的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
答案 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
进行比较并使用索引进行索引扫描。